dominikg
Goto Top

Bestimmte Werte aus txt-datei auslesen per batch

Hallo,

ich möchte gewisse werte aus einer textdatei auslesen per batch!
Das sind Zahlenwerte die ausgelesen werden, das heißt von einstelligen zahlen bis 5 oder mehr stellen.
also in der textdatei mit zeilenumbruch steht in zeile 15 ab zeichen 50 die zahl 55 als beispiel, wie kann ich diese zahl auslesen bzw jede zahl, die ab dieser stelle steht, egal wie viele stellen diese hat und egal ab wie viel zeichen in dieser zeile die zahl steht?

Vielen Dank

Content-Key: 168647

Url: https://administrator.de/contentid/168647

Ausgedruckt am: 28.03.2024 um 08:03 Uhr

Mitglied: bastla
bastla 26.06.2011 um 22:02:41 Uhr
Goto Top
Hallo DominikG!

Gibt es in Deiner Problemstellung auch irgend etwas Greifbares, oder ist eigentlich alles egal? face-wink

Konkreter gefragt:
  • Soll die Zahl in Zeile 15 (oder einer anderen zu identifizierenden Zeile) gesucht werden?
  • Besteht die Zahl nur aus den Ziffern 0-9, oder kann sie auch ein Komma (als "." oder ","?) oder ein Vorzeichen enthalten?
  • Enthält die Zeile nur eine derartige Zahl?

Grüße
bastla
Mitglied: mathe172
mathe172 26.06.2011 um 22:06:48 Uhr
Goto Top
Hallo,

eine etwas "hässliche" Möglichkeit wäre folgende (ungetestet):
@echo off & setlocal enabledelayedexpansion
set "File=C:\File.txt"  

for /f "usebackq delims=" %%A in ("%File%") do (  
for /f "skip=14 tokens=1* delims=0123456789" %%B in ("%%A") do (  
call :ProcessLine "%%A" "%%B" "%%C"   
pause
goto :eof
)

:ProcessLine
set "Line=%~1"  
set "Line=!Line:%~2=!"  
set "Line=!Line:%~3=!"  
echo.%Line%
goto :eof

Mathe172
Mitglied: bastla
bastla 26.06.2011 um 22:19:00 Uhr
Goto Top
@mathe172
Damit hast Du meine Fragen mit "ja / ersteres / ja" beantwortet ... face-wink

Als kleine (ungetestete) "Verschönerung" (die Zerlegung hätte ich aber auch so vorgenommen face-smile):
@echo off & setlocal enabledelayedexpansion
set "File=C:\File.txt"  

set "Line="  
for /f "usebackq skip=14 delims=" %%A in ("%File%") do if not defined Line for /f "tokens=1* delims=0123456789" %%B in ("%%A") do call :ProcessLine "%%A" "%%B" "%%C"  
pause
goto :eof

:ProcessLine
set "Line=%~1"  
set "Line=!Line:%~2=!"  
set "Line=!Line:%~3=!"  
if not defined Line set "Line=nicht gefunden!"  
echo.%Line%
goto :eof
oder ohne "delayedExpansion":
@echo off & setlocal
set "File=C:\File.txt"  

set "Line="  
for /f "usebackq skip=14 delims=" %%A in ("%File%") do if not defined Line for /f "tokens=1* delims=0123456789" %%B in ("%%A") do call :ProcessLine "%%A" "%%B" "%%C"  
pause
goto :eof

:ProcessLine
set "Line=%~1"  
call set "Line=%%Line:%~2=%%"  
call set "Line=%%Line:%~3=%%"  
if not defined Line set "Line=nicht gefunden!"  
echo.%Line%
goto :eof
Grüße
bastla

P.S.: Anstelle von %Line% wäre %Number% eine "sprechendere" Variable ...
Mitglied: DominikG
DominikG 26.06.2011 um 22:23:52 Uhr
Goto Top
also ich habe die txt jetz nicht vor mir aber die zeilen müssten immer die gleichen sein und in der zeile stehen mehrere werte hintereinander und der benötigte wert ist der erste (bin mir nicht ganz sicher).
das sind keine zahlen mit komma oder sonstiges
Mitglied: bastla
bastla 26.06.2011 um 22:26:10 Uhr
Goto Top
Hallo DominikG!

Unter den von Dir genannten Annahmen nehme ich an, dass einer der Batches oben das gewünschte Ergebnis liefern sollte ... face-wink

Grüße
bastla
Mitglied: DominikG
DominikG 28.06.2011 um 11:07:39 Uhr
Goto Top
Also danke für eure Hilfe erst mal aber ich bekomms nicht hin, aber ich hab jetzt die txt-Datei und kopier mal den für mich wichtigen teil jetzt rein:
1 Raw_Read_Error_Rate 0x002f 200 200 051 Pre-fail Always - 0
3 Spin_Up_Time 0x0027 146 131 021 Pre-fail Always - 5700
4 Start_Stop_Count 0x0032 100 100 000 Old_age Always - 109
5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0
7 Seek_Error_Rate 0x002e 200 200 000 Old_age Always - 0
9 Power_On_Hours 0x0032 095 095 000 Old_age Always - 4218
10 Spin_Retry_Count 0x0032 100 100 000 Old_age Always - 0
11 Calibration_Retry_Count 0x0032 100 100 000 Old_age Always - 0
12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 107
192 Power-Off_Retract_Count 0x0032 200 200 000 Old_age Always - 83
193 Load_Cycle_Count 0x0032 171 171 000 Old_age Always - 89131
194 Temperature_Celsius 0x0022 106 102 000 Old_age Always - 41
196 Reallocated_Event_Count 0x0032 200 200 000 Old_age Always - 0
197 Current_Pending_Sector 0x0032 200 200 000 Old_age Always - 0
198 Offline_Uncorrectable 0x0030 200 200 000 Old_age Offline - 0
199 UDMA_CRC_Error_Count 0x0032 200 198 000 Old_age Always - 53
200 Multi_Zone_Error_Rate 0x0008 200 200 000 Old_age Offline - 0

in der TXT-Datei sind diese werte, wie eine Tabelle angeordnet und etwas übersichtlicher. ich benötige immer den letzten wert in den Reihen!


Wie kann ich diese Werte rausziehen per Batch?
Mitglied: BigWim
BigWim 28.06.2011 um 11:55:10 Uhr
Goto Top
Moin

ich hatte ein paar Probleme mit den Trennzeichen, aber es funktioniert. Vielleicht nicht elegant, aber es funktioniert

@echo off

for /f "delims=*" %%a in (input.txt) do call :GetLast10Char "%%a"  
goto :eof

:GetLast10Char
Set Zeile=%1
Set Last11Char=%Zeile:~-11%
Set Last10Char=%Last11Char:~0,10%
for /f "tokens=2 delims=-" %%b in ("%Last10Char%") do Call :Machwat %%b  
goto :eof


:MachWat
Set Zahl=%1

echo Zahl = %Zahl%

Gruß
Markus

[edit]
in Input.txt habe ich Dein Beispiel kopiert
[/edit]
Mitglied: DominikG
DominikG 28.06.2011 um 12:01:41 Uhr
Goto Top
aber dies ist nur ein ausschnitt aus der kompletten txt-datei!
diese daten stehen erst in zeile 30 oder so, das ist ja bestimmt nicht mit berücksichtigt oder?
Mitglied: BigWim
BigWim 28.06.2011 um 13:50:32 Uhr
Goto Top
Moin,

diese daten stehen erst in zeile 30 oder so, das ist ja bestimmt nicht mit berücksichtigt oder?
Mein Fehler, muß ich wohl überlesen haben, oder?

Wenn es Zeile 30 ist, kannst Du die Zeile 3 anpassen.

for /f "delims=* skip=30" %%a in (input.txt) do call :GetLast10Char "%%a"   

Bei der Umsetzung von oder so reichen leider meine Kenntnisse nicht aus .....

Gruß
Markus
Mitglied: bastla
bastla 28.06.2011 um 14:37:03 Uhr
Goto Top
Hallo DominikG!

Da jetzt doch nicht der erste Wert benötigt wird: Ist es (wie ich Deinen Beispieldaten entnehmen würde) sicher, dass nach dem letzten "_" nur ein "-" und danach dann der gesuchte Wert (immer eine Zahl ohne Vorzeichen und Dezimalstellen?) folgt?

Grüße
bastla
Mitglied: DominikG
DominikG 28.06.2011 um 14:39:55 Uhr
Goto Top
ja das ein bindestrich bzw minus und die Zahl ist eine Zahl ohne Vorzeichen und ohne nachkommastellen!
Mitglied: mathe172
mathe172 28.06.2011 um 16:22:29 Uhr
Goto Top
Hallo,
sonst schau dir mal dieses Tutorial von Friemler an. Damit ist es möglich, den letzten Token zu bekommen.

Sonst, probiers mal so(@bastla: Die Zeile mit der 3 -hat nach dem letzten "_" zwei "-"):
for /f "usebackq delims=" %%A in ("Input.txt") do ((for %%B in ("%%A") do (set "Last=%%B")) & (call echo.%Last%))  
Dieser Code gibt den Wert in allen Zeilen an

Mathe172
Mitglied: bastla
bastla 28.06.2011 um 17:33:29 Uhr
Goto Top
@math172
@bastla: Die Zeile mit der 3 -hat nach dem letzten "_" zwei "-"
So genau hatte ich mir die Daten dann auch nicht angesehen - das ist eigentlich der Job des TE ...

... jedenfalls sollte das auf Basis von BigWims Vorschlag realisierbar sein und auch Dein Ansatz müsste vom Prinzip her klappen - mit Anpassung einiger Details und etwas übersichtlicherer Darstellung könnte der dann zB so aussehen:
@REM mathe172 nachempfunden ;-)
@echo off & setlocal enabledelayedexpansion
for /f "usebackq skip=29 delims=" %%A in ("Input.txt") do (  
    set "Last=nicht gefunden"  
    for %%B in (%%A) do set "Last=%%B"  
    echo !Last!
)
Grüße
bastla
Mitglied: mathe172
mathe172 28.06.2011 um 19:00:44 Uhr
Goto Top
Hallo,
@bastla:
@bastla: Die Zeile mit der 3 -hat nach dem letzten "_" zwei "-"
Ich wollte dich und andere nur darauf hinweisen, da ich die Antwort des TO etwas irreführend fand - war in keinster Weise böse gemeint face-smile

MfG,
Mathe172
P.S.:Notiz an mich: Ich sollte nicht mehr soviele Einzeiler abliefern, nur weil es geht und weil ich nicht Return drücken will - ist unübersichtlich face-wink
P.P.S.:Aber für das entziffern für die TE's gibts ja Bastla & Co. face-smile
Mitglied: bastla
bastla 28.06.2011 um 20:12:13 Uhr
Goto Top
@mathe172
war in keinster Weise böse gemeint face-smile
Habe ich auch nicht so verstanden - ich wollte damit vor allem auf die Bringschuld des TE hinweisen ...
Gegen Einzeiler habe ich grundsätzlich nix einzuwenden - aber bei mir wollte dieser wegen der fehlenden "delayedExpansion" und vor allem wegen der Anführungszeichen um %%A herum (konterkarieren die gute Idee mit der Zerlegung anhand der Leerzeichen) nicht ...

Grüße
bastla
Mitglied: DominikG
DominikG 29.06.2011 um 08:24:28 Uhr
Goto Top
Vielen Dank für eure Hilfe!
Ich hab das ganze jetzt getestet und es funktioniert super.
Jetzt habe ich nur noch eine Frage!
Ich möchte gerne noch die Bezeichnungen der Werte, wie sie oben in der tabelle stehen, zuordnen und gleich in variablen setzen, als beispiel:

set "Raw_Read_Error_Rate"=0
set "Spin_Up_Time "=5700
usw

Ist dieses auch zu realisieren?
Mitglied: bastla
bastla 29.06.2011 um 09:41:41 Uhr
Goto Top
Hallo DominikG!

Zu realisieren wäre es zwar etwa so (ungetestet und unter der Voraussetzung, dass die gesuchte Bezeichnung keine Kommata,Semikolons, Leerzeichen enthält):
@REM mathe172 nachempfunden ;-)
@echo off & setlocal enabledelayedexpansion
for /f "usebackq skip=29 delims=" %%A in ("Input.txt") do (  
    set "First="  
    set "Last=nicht gefunden"  
    for %%B in (%%A) do (
        if not defined First set "First=%%B"  
        set "Last=%%B"  
	)
    echo !First!=!Last!
    set "!First!=!Last!"  
)
- interessant wäre allerdings, welchen Sinn das haben soll ...

Grüße
bastla
Mitglied: DominikG
DominikG 29.06.2011 um 09:44:55 Uhr
Goto Top
Das ist einfach nur für eine Berechnung wichtig, wie "gut" es einer Festplatte in Prozent geht!
Mitglied: bastla
bastla 29.06.2011 um 10:04:49 Uhr
Goto Top
Hallo DominikG!

Eigentlich hatte ich gemeint, was es bringen solle, Variablennamen (wie "Raw_Read_Error_Rate"), die sich aus den einzulesenden Daten ergeben, zu verwenden - es sei denn, es wären gesichert immer die gleichen Zeilen (= Variablen) in der Datei, sodass im weiteren Ablauf auf diese Variablen zugegriffen werden könnte ...

Grüße
bastla
Mitglied: DominikG
DominikG 30.06.2011 um 07:49:37 Uhr
Goto Top
Sorry das ich hier ständig was neues habe und nerve!
Also ich habe jetzt noch mal alles durchgearbeitet in meiner Textdatei und nach den Werten geschaut die ich aus der Tabelle, welche ich etwas weiter oben eingefügt habe in diesem thread, brauche.
Und zwar brauche ich die werte von den id´s: 1, 5 10, 196, 197, 198!
Diese benötige ich als feste variablen, mit denen ich dann gleich weiter arbeiten kann.

Wäre dies auch mit so einer kleinen Batch zu händeln?

Vielen Dank!
Mitglied: mathe172
mathe172 30.06.2011 um 13:26:04 Uhr
Goto Top
Hallo,

wenn ich dich richtig verstanden habe, sollte das gehen:

@REM mathe172 nachempfunden ;-)
@echo off & setlocal enabledelayedexpansion
for /f "usebackq skip=29 delims=" %%A in ("Input.txt") do (  
    set "First="  
    set "Last=nicht gefunden"  
    for %%B in (%%A) do (
        if not defined First set "First=%%B"  
        set "Last=%%B"  
	)
    echo ID!First!=!Last!
    set "ID!First!=!Last!"  
)
echo %ID1%
REM usw....
Für jede ID erstellt der Code eine Variable mit der Form "ID%ID%". Für deine bräuchtest du jetzt: "%ID1%" "%ID5%" "%ID10%" ...
Der Code ist der von Bastla, der ja auch schon die Variablen setzt, nur habe ich die Namensgebung etwas verändert, dass keine Variablennamen rein numerisch sind.

Mathe172
Mitglied: bastla
bastla 30.06.2011 um 13:35:15 Uhr
Goto Top
... wobei mit der geänderten Zeile 11
echo #1#5#10#196#197#198#|findstr "#!First!#">nul && set "ID!First!=!Last!"
die gewünschte Beschränkung erfolgen könnte ...

Grüße
bastla
Mitglied: DominikG
DominikG 30.06.2011 um 13:49:01 Uhr
Goto Top
Ich glaube ich mache noch irgendwas falsch, deswegen poste ich jetzt doch mal den ganzen Text dieser TXT-Datei (wollte ich eigentlich vermeiden, weil das schon ziemlich viel ist)
Also wie gesagt, ich brauche nur die genannten Werte als Variable, weil ich mit diesen dann etwas ausrechnen will.


smartctl 5.41 2011-06-09 r3365 [i686-w64-mingw32-vista(64)-sp2] (sf-win32-5.41-1)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Model Family: Western Digital Caviar Green (Adv. Format)
Device Model: WDC WD10EARS-22Y5B1
Serial Number: WD-WCAV5J426275
LU WWN Device Id: 5 0014ee 25a73f15e
Firmware Version: 80.00A80
User Capacity: 1.000.204.886.016 bytes [1,00 TB]
Sector Sizes: 512 bytes logical, 4096 bytes physical
Device is: In smartctl database [for details use: -P show]
ATA Version is: 8
ATA Standard is: Exact ATA specification draft version not indicated
Local Time is: Tue Jun 28 10:56:58 2011 MS
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status: (0x84) Offline data collection activity
was suspended by an interrupting command from host.
Auto Offline Data Collection: Enabled.
Self-test execution status: ( 0) The previous self-test routine completed
without error or no self-test has ever
been run.
Total time to complete Offline
data collection: (22080) seconds.
Offline data collection
capabilities: (0x7b) SMART execute Offline immediate.
Auto Offline data collection on/off support.
Suspend Offline collection upon new
command.
Offline surface scan supported.
Self-test supported.
Conveyance Self-test supported.
Selective Self-test supported.
SMART capabilities: (0x0003) Saves SMART data before entering
power-saving mode.
Supports SMART auto save timer.
Error logging capability: (0x01) Error logging supported.
General Purpose Logging supported.
Short self-test routine
recommended polling time: ( 2) minutes.
Extended self-test routine
recommended polling time: ( 254) minutes.
Conveyance self-test routine
recommended polling time: ( 5) minutes.
SCT capabilities: (0x3035) SCT Status supported.
SCT Feature Control supported.
SCT Data Table supported.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x002f 200 200 051 Pre-fail Always - 0
3 Spin_Up_Time 0x0027 146 131 021 Pre-fail Always - 5700
4 Start_Stop_Count 0x0032 100 100 000 Old_age Always - 109
5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0
7 Seek_Error_Rate 0x002e 200 200 000 Old_age Always - 0
9 Power_On_Hours 0x0032 095 095 000 Old_age Always - 4218
10 Spin_Retry_Count 0x0032 100 100 000 Old_age Always - 0
11 Calibration_Retry_Count 0x0032 100 100 000 Old_age Always - 0
12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 107
192 Power-Off_Retract_Count 0x0032 200 200 000 Old_age Always - 83
193 Load_Cycle_Count 0x0032 171 171 000 Old_age Always - 89131
194 Temperature_Celsius 0x0022 106 102 000 Old_age Always - 41
196 Reallocated_Event_Count 0x0032 200 200 000 Old_age Always - 0
197 Current_Pending_Sector 0x0032 200 200 000 Old_age Always - 0
198 Offline_Uncorrectable 0x0030 200 200 000 Old_age Offline - 0
199 UDMA_CRC_Error_Count 0x0032 200 198 000 Old_age Always - 53
200 Multi_Zone_Error_Rate 0x0008 200 200 000 Old_age Offline - 0

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
  1. 1 Short offline Completed without error 00% 4119 -
  2. 2 Short offline Aborted by host 90% 1479 -

SMART Selective self-test log data structure revision number 1
SPAN MIN_LBA MAX_LBA CURRENT_TEST_STATUS
1 0 0 Not_testing
2 0 0 Not_testing
3 0 0 Not_testing
4 0 0 Not_testing
5 0 0 Not_testing
Selective self-test flags (0x0):
After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.
Mitglied: bastla
bastla 30.06.2011 um 14:06:03 Uhr
Goto Top
Hallo DominikG!

Wenn das jetzt die ganze Wahrheit sein sollte, dann:
@echo off & setlocal enabledelayedexpansion
set "Values=Raw_Read_Error_Rate Reallocated_Sector_Ct Spin_Retry_Count Reallocated_Event_Count Current_Pending_Sector Offline_Uncorrectable"  

for /f "delims=" %%A in ('findstr "%Values%" "Input.txt"') do (  
    set "First="  
    set "Last=nicht gefunden"  
    for %%B in (%%A) do (
        if not defined First set "First=%%B"  
        set "Last=%%B"  
    )
    set "ID!First!=!Last!"  
)
set ID
Grüße
bastla
Mitglied: DominikG
DominikG 01.07.2011 um 10:15:46 Uhr
Goto Top
Vielen Dank die Batch läuft super!
Jetzt habe ich meine Batch ja schon fertig mit der ich rechne, aber da müssen diese werte noch alle per hand eingetragen werden.
Wenn ich jetzt meine batch in die Batch, aus der die werte gelsen werden, einfüge kann ich dann mit den werten bzw. den variablen weiter rechnen oder muss da noch mehr gemacht werden damit das läuft?

Meiner Batch:

Zur erklärung schreibe ich noch hinzu, welche abkürzung in meiner batch der id, in der oben von mir geposteten tabelle, entspricht.

RSC=ID5
RE =ID196
CP =ID197
US =ID198
RER=ID1
SRC=ID10


Batch:


@echo off



set /P rsc1=RSC-Wert eingeben:
echo %rsc1% * 2
set /a rsc2=%rsc1%*2

if %rsc2% LSS 70 (
     set /a rsc3=100-%rsc2%
) ELSE (
set rsc3=30
)

echo %rsc3%



set /P re1=RE-Wert eingeben:
echo %re1% * 1
set /a re2=%re1%*1

if %re2% LSS 40 (
     set /a re3=100-%re2%
) ELSE (
set re3=60 )

echo %re3%




set /P cp1=Cp-Wert eingeben:
echo %cp1% * 1
set /a cp2=%cp1%*1

if %cp2% LSS 40 (
     set /a cp3=100-%cp2%
) ELSE (
set cp3=60 )

echo %cp3%



set /P us1=US-Wert eingeben:
echo %us1% * 2
set /a us2=%us1%*2

if %us2% LSS 70 (
     set /a us3=100-%us2%
) ELSE (
set us3=30 )

echo %us3%




set /P rer1=RER-Wert eingeben:
echo %rer1% * 1
set /a rer2=%rer1%*1

IF %rer2% LSS 10 (
     set /a rer3=100-%rer2%
) ELSE (
set rer3=90 )

echo %rer3%




set /P src1=SRC-Wert eingeben:
echo %src1% * 2
set /a src2=%src1%*2

if %src2% LSS 50 (
     set /a src3=100-%src2%
) ELSE (
set src3=50 )

echo %src3%




set /a zustand=%rsc3%*%re3%/100*%cp3%/100*%us3%/100*%rer3%/100*%src3%/100

echo HDD-Zustand: %zustand%
echo ===================

[Edit Biber] Codeformatierung ergänzt. @56: Das schaffst du auch! [/Edit]
Mitglied: bastla
bastla 01.07.2011 um 12:06:08 Uhr
Goto Top
Hallo DominikG!
Wenn ich jetzt meine batch in die Batch, aus der die werte gelsen werden, einfüge kann ich dann mit den werten bzw. den variablen weiter rechnen oder muss da noch mehr gemacht werden damit das läuft?
Du musst natürlich entweder Deine Zuordnungstabelle zum Übertragen der Variablenwerte einbauen, also:
set "rsc=%ID5%"  
set "re =%ID196%"  
...
oder jedes Vorkommen von zB %rer% durch %ID1% ersetzen - ansonsten sollte das Berechnen so wie vorher funktionieren ...

Grüße
bastla