Daten mittels Batch aus Textdatei holen
lima-city → Forum → Heim-PC → Software
ablage
auffinden
auslese
automatischen auslesen
code
datei
datum
file
machen
menge
segment
set
suche
test
text
textdatei
treffer
windows
zahl
zeile
-
Hallo liebe Leute,
ich bin gerade dabei eine große Menge an Messdaten aus einem (vielen, aber sie sind alle gleich aufgebaut) Text-Files zu ziehen. Bislang ist das Mittel der Wahl durchscrollen und die interessanten Werte abtippen.
Folgende Blöcke kommen in den Files mehrfach vor (dazwischen ist leider jeweils eine variable Anzahl von Zeilen):
surface 1000
segment: -1100
8.39846E-04 0.0000
surface 1000
segment: 1100 -1101
2.02745E-09 0.0401
..
.
.
.
surface 1000
flagged tallies
segment: -1100
6.53377E-05 0.0004
surface 1000
flagged tallies
segment: 1100 -1101
2.02745E-09 0.0401
.
.
.
.
.
..
Davon interessiert mich allerdings nur ein überschaubarer Teil, nämlich die Werte nach den Zeilen
surface 1000
segment: -1100
bzw
surface 1000
,
flagged tallies
segment: -1100
ich habe sie im obersten Textbeispiel fett hervorgehoben.
Im Idealfall würden die Zeilen danach bzw. noch besser die beiden einzelnen Werte in der darauffolgenden Zeile in ein Excel-, TXT- oder CSV-File übernommen.
Leider bin ich mit meinen bescheidenen Batch-Kenntnissen am automatischen Auslesen der Files gescheitert (weil die interessanten Zeilen nicht in regelmäßigen Abständen vorkommen), hat jemand von euch vielleicht eine Idee oder einen Ansatz für mich??
Vielen lieben Dank!
Beitrag zuletzt geändert: 17.4.2015 13:01:21 von chst -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
hallo chst,
ich gehe mal davon aus das das ganze auf einem windows-rechner stattfindet.
mit einer ganz einfachen batch könntest du zb jede zeile in eine neue textdatei schreiben lassen die mit einer zahl beginnt (als einfachstes suchkriterium):
for /f "delims=:" %%i in ('findstr /b "[0-9]" "text.txt"') do echo %%i>>treffer.txt
erstelle einfach eine neue textdatei und nenne zb "batch.txt".
bearbeite sie im editor und füge die obenstehende codezeile ein - speichern.
benenne die datei in batch.bat um.
wenn du nun diese datei und deine zu durchsuchende textdatei (diese muss in diesem beispiel dann "text.txt" heißen) in ein und demselben ordner hast einfach die "batch.bat" ausführen und schon wird eine neue datei (treffer.txt) erstellt in der nur alle zeilen vorhanden sind die mit einer zahl beginnen.
Das ist natürlich ganz schön quick&dirty aber vielleicht reichts ja so für deine zwecke.
lg hechma -
Guten Morgen hechma,
vielen Dank für deine Tipps!
Leider finden sich in dem Textfile viiiiiiele Zahlen, da würde die Dateien-Menge wohl zu unübersichtlich werden.
Ich habe das zeilenweise Auslesen also noch mit einem anderen findstr (und der Option C, um auch nach den Leerzeichen suchen zu können) modifiziert und finde nun alle Zeilen, wo das Intro für meine Datenblöcke zu finden ist:
for /f "delims=" %%i in ('findstr /C:"surface 1000" test.txt') do @( echo %%i )
Im Gegensatz zu PHP wird in %%i aber nur der Reintext der Zeile, nicht aber die Zeilennummer hinterlegt.
Nun habe ich auch schon die Zeilennummer herausgefunden:
for /f "delims=" %%i in ('findstr /N /C:"surface 1000" test.txt') do @( for /F "tokens=1 delims=:" %%a in ("%%i") do set zeile1=%%a echo %zeile1% )
Was für mich ideal wäre: Eine zweite Schleife mit einer Suche die abfragt, ob in der jeweils nachfolgenden Zeile nochmal eine spezielle Zeichenfolge xyz vorkommt. In der darauf folgenden Zeile befinden sich dann die Daten, die ich eigentlich suche ;)
Vielen Dank für jede Hilfe!
Beitrag zuletzt geändert: 18.4.2015 9:10:59 von chst -
hallo chst,
na da bist du ja auf dem richtigen weg. ich selber hatte vorher auch noch nie was mit windows-batch gemacht deshlab kann ich dir das nicht mal schnell aus dem ärmel schütteln - aber die variable der zeilennummer um eins hochzuzählen und die variable mit in die ausgabe zu übernehmen sollte ja kein problem sein... versuch macht kluch
lg hechma -
Hallo!
Wie zuletzt erwähnt, funktioniert das Auffinden der relevanten Intro-Zeilen ganz gut. Da eine Ablage der Daten in einem Batch in einem Vektor wohl nicht möglich ist, habe ich die Zeilennummern in ein Hilfs-txt geschrieben.
Das Ganze sieht wie folgt aus: Ich öffne die Quelldatei und suche nach einer Textpassage, speichere danach die Zeilennummern ab:for /f "delims=" %%i in ('findstr /N /C:" segment: -1100" test.txt') do @( ::echo %%i for /F "tokens=1 delims=:" %%a in ("%%i") do @( echo %%a>>zwischenspeicher.txt ) )
Zum Auslesen einen speziellen Zeile aus einem TXT-File habe ich folgenden Code im Internet gefunden:set /a LineNo=364 set /a LineNo=LineNo+1 set "line=" for /f "delims=" %%b in ('more/e +%LineNo% ^< test.txt') do ( if not defined line set "line=%%b" ) echo %line%
Auch dieser Teil funktioniert mehr oder weniger zuverlässig.
Kombiniere ich nun die beiden Teile wie folgt,
so kommen verschiedenste Fehlermeldungen. Allen voran kann er mit der Übergabe des %%f nicht umgehen. echo %%f listet die Einträge noch richtig auf, definiere ich die jeweils gesuchte Zeile aber innerhalb der For-Schleife, so wird im besten Fall einer der Einträge mehrfach ausgegeben.FOR /f %%f IN (zwischenspeicher.txt) DO (echo %%f set /a LineNo=%%f set /a LineNo=LineNo+1 set "line=" for /f "delims=" %%b in ('more/e +%LineNo% ^< test.txt') do ( if not defined line set "line=%%b" ) echo %line% )
Hat vielleicht noch jemand eine Idee, wo mein Fehler liegen könnte?
Danke!
------------------------------------------------------
Nachtrag:
Ich habe nun einen einigermaßen funktionierenden Code gebastelt, den ich mit der Allgemeinheit teilen wollte:
setlocal enabledelayedexpansion set "searchdir=." set "searchfiles=file" SET VARIABLE=1 :Loop echo %VARIABLE% set "searchstr= surface " set "searchstr=%searchstr%%VARIABLE%" echo %searchstr% for %%a in ("%searchdir%\%searchfiles%") do ( for /f "delims=:" %%b in ('findstr /b /i /n /c:"%searchstr%" "%%a"') do ( echo %%b set /a theNextline=%%b+1 > NUL for /f "delims=: tokens=1,*" %%i in ('findstr /n $ "%%a" ^| findstr /b /c:"!theNextLine!"') do ( if "%%j" neq " flagged tallies" ( echo %%j>>tally.txt ) else ( if "%%j" equ " flagged tallies" ( set /a theNextline=%%b+2 > NUL for /f "delims=: tokens=1,*" %%i in ('findstr /n $ "%%a" ^| findstr /b "!theNextLine!"') do ( if "%%j" neq "" echo %%j>>flagged.txt ) ) ) ) ) ) if "%VARIABLE%" LSS "1010" ( SET /A VARIABLE=%VARIABLE%+1 GOTO Loop )
Beitrag zuletzt geändert: 3.9.2017 15:48:49 von kaetzle7 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage