kostenloser Webspace werbefrei: lima-city


Daten mittels Batch aus Textdatei holen

lima-cityForumHeim-PCSoftware

  1. Autor dieses Themas

    chst

    chst hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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
  4. Autor dieses Themas

    chst

    chst hat kostenlosen Webspace.

    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
  5. 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
  6. Autor dieses Themas

    chst

    chst hat kostenlosen Webspace.

    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,
    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%
    
    )
    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.

    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
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!