115129
Goto Top

BATCH - Wort in Zeile suchen, wenn gefunden in txt-Datei schreiben. (ggfls. mit Umformatierung)

Hallo,

ich habe ein erneutes Anliegen und weis nicht recht wie ich das bewerkstelligen soll.

Es existiert eine "Beispiel.log" Datei in der mir ein Batch-Script nach den Worten "SOLL" und "IST" zeilenweise suchen soll.
Wurde einer der beiden Namen gefunden, soll die komplette Zeile in die Datei "Ausgabe.text" verschoben werden.
Die Zeilen enthalten Sonderzeichen wie: "@*


Wäre eine Umstrukturierung der Zeile während des Schreibens in die "Ausgabe.text" möglich?

Beispielsauszug einer (zweier) Zeile innerhalb der Beispiel.log:
05-26-2014 00:15:41 IST: "A1" "B2" "C3" "D4" "*@12f*543-.d6"
05-27-2014 19:07:48 SOLL: "E5" "F6" "G7" "H8" "*@f465*1f"

Umstrukturierung nach Ausgabe.text:
2014.05.26 00:15:41 | IST | A: B2 | B: C3 | C: D4 | D: *@12f*543-.d6
2014.05.27 19:07:48 | SOLL | A: F6 | B: G7 | C: H8 | D: *@f465*1f

Wenn's zu kompliziert oder nicht händelbar ist, wäre ich mit dem verschieben schon mal bestens bedient face-smile

Vielen Dank im voraus.

Grüße,
Blattlaus

Content-Key: 239371

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

Printed on: April 25, 2024 at 21:04 o'clock

Member: bastla
bastla May 27, 2014, updated at May 28, 2014 at 05:10:15 (UTC)
Goto Top
Hallo BlattlausOG!

Zum Filtern sollte eigentlich eine Zeile der Art
findstr "SOLL IST" Beispiel.log>Ausgabe.text
genügen ...

... und was das Umwandeln angeht - im einfachsten Fall (Voraussetzung: Die Datenwerte enthalten keine Leerzeichen und kein "!") etwa so:
@echo off & setlocal
set "Ein=D:\Beispiel.log"  
set "Aus=D:\Ausgabe.text"  

del "%Aus%" 2>nul  
for /f "tokens=1-9* delims=- " %%a in ('findstr /i "SOLL IST" "%Ein%"') do (  
    set "SollIst=%%e"  
    setlocal enabledelayedexpansion
    >>"%Aus%" echo %%c.%%a.%%b %%d ^| !SollIst::=! ^| A: %%~g ^| B: %%~h ^| C: %%~i ^| D: %%~j  
    endlocal
)
Grüße
bastla

[Edit] "findstr" angepasst, sodass für "IST" und "SOLL" die Groß-/Kleinschreibung ignoriert wird [/Edit]
Mitglied: 115129
115129 May 27, 2014 updated at 21:08:16 (UTC)
Goto Top
Hallo Bastla,

Zu deinem Einzeiler:
So etwas in der Art hatte ich bereits getestet...bei mir hat das "verschieben" aber nicht funktioniert...

Zu der Formatierung:
Eingelesen werden nur die Zeilen die IST und SOLL beinhalten. Alles was innerhalb "" steht ist variabel und soll ohne "" wieder ausgegeben werden.
Außer in diesem Fall "A1" bzw. "E5", der erste Wert soll nicht ausgegeben werden.


Beispielsauszug einer (zweier) Zeile innerhalb der Beispiel.log:
05-26-2014 00:15:41 IST: "A1" "B2" "C3" "D4" "*@12f*543-.d6"
05-27-2014 19:07:48 SOLL: "E5" "F6" "G7" "H8" "*@f465*1f"

Umstrukturierung nach Ausgabe.text:
2014.05.26 00:15:41 | IST | A: B2 | B: C3 | C: D4 | D: *@12f*543-.d6
2014.05.27 19:07:48 | SOLL | A: F6 | B: G7 | C: H8 | D: *@f465*1f

Die Angaben A: B: C: D: will ich später selbst einmalig deklarieren. Als Ausgabedefinition.

Grüße
Member: bastla
bastla May 27, 2014 at 21:12:22 (UTC)
Goto Top
Hallo BlattlausOG!

Ich habe inzwischen oben einen Entwurf ergänzt ...

Wenn tatsächlich die Zeilen "verschoben" (also aus der "Beispiel.log" nach Verarbeitung gelöscht) werden sollen, sollte sich das durch das Hinzufügen der folgenden Zeilen am Ende des Batches umsetzen lassen:
move "%Ein%" "%temp%\Ein.log"  
findstr /V "SOLL IST" "%temp%\Ein.log">"%Ein%"  
del "%temp%\Ein.log"  
Grüße
bastla
Mitglied: 115129
115129 May 27, 2014 updated at 21:27:25 (UTC)
Goto Top
Zitat von @bastla:

Hallo BlattlausOG!

Zum Filtern sollte eigentlich eine Zeile der Art
findstr "SOLL IST" Beispiel.log>Ausgabe.text
> 
genügen ...

... und was das Umwandeln angeht - im einfachsten Fall (Voraussetzung: Die Datenwerte enthalten keine Leerzeichen und kein
"!") etwa so:
@echo off & setlocal
> set "Ein=D:\Beispiel.log"  
> set "Aus=D:\Ausgabe.text"  
> 
> del "%Aus%" 2>nul  
> for /f "tokens=1-9* delims=- " %%a in ('findstr "SOLL IST" "%Ein%"') do (  
>     set "SollIst=%%e"  
>     setlocal enabledelayedexpansion
>     >>"%Aus%" echo %%c.%%a.%%b %%d ^| !SollIst::=! ^| A: %%~g ^| B: %%~h ^| C: %%~i ^| D: %%~j  
>     endlocal
> )
> 
Grüße
bastla

...in den Zeilen sind Leerfelder vorhanden...
siehe:
05-26-2014 00:15:41 IST: "A1" "B2" "C3" "D4" "*@12f*543-.d6"

Habs grad getestet...tut sich nix, es wird auch keine Ausgabe.text generiert...
Member: bastla
bastla May 28, 2014 at 05:08:55 (UTC)
Goto Top
Hallo BlattlausOG!
...in den Zeilen sind Leerfelder vorhanden...
Die Frage war aber nicht nach den Zeilen (dort sind die Leerzeichen ja als Trennzeichen nötig; es sei denn, die einzelnen Werten würden durch TAB getrennt, was sich aus Deinem Beispiel - auch mangels passender Formatierung - nicht erkennen lässt), sondern nach den Feldern (also etwa, ob es in "*@12f*543-.d6" auch Leerzeichen geben kann) ...
tut sich nix, es wird auch keine Ausgabe.text generiert...
Schwer nachvollziehbar - am ehesten noch erklärbar, wenn "IST" und "SOLL" nicht in Großbuchstaben geschrieben wären (ich ergänze oben noch das nötige "/i"). Damit Du den Ablauf nachvollziehen kannst, ändere "echo off" auf "echo on".

Grüße
bastla
Mitglied: 115129
115129 May 28, 2014 updated at 16:21:08 (UTC)
Goto Top
Hallo Bastla,

ich habe nun dein Code nochmal gestestet.

Die Daten werden gesucht, gefunden, angeordnet und in die neue Datei geschrieben...soweit so gut.

Ein Problem habe ich dennoch, dies war mein Fehler.
In der vorletzten Zeile gibt es ein Leerzeichen ( im Beispiel unten wäre es in D4 und H8).

Beispielsauszug einer (zweier) Zeile innerhalb der Beispiel.log:
05-26-2014 00:15:41 IST: "A1" "B2" "C3" "D4" "*@12f*543-.d6"
05-27-2014 19:07:48 SOLL: "E5" "F6" "G7" "H8" "*@f465*1f"

Umstrukturierung nach Ausgabe.text:
2014.05.26 00:15:41 | IST | A: B2 | B: C3 | C: D4 | D: *@12f*543-.d6
2014.05.27 19:07:48 | SOLL | A: F6 | B: G7 | C: H8 | D: *@f465*1f

Im Moment bringt er in den letzten 2 Spalten was durcheinander.

Vielen Dank im voraus für ne Anpassung face-smile

Gruß,
Blattlaus
Member: bastla
Solution bastla May 28, 2014 updated at 18:15:24 (UTC)
Goto Top
Hallo BlattlausOG!
In der vorletzten Zeile gibt es ein Leerzeichen ( im Beispiel unten wäre es in D4 und H8).
Du meinst vermutlich Spalte ...

Wenn das Leerzeichen immer an dieser Stelle vorhanden ist, sollte folgende angepasste Schleife funktionieren:
for /f "tokens=1-10* delims=- " %%a in ('findstr /i "SOLL IST" "%Ein%"') do (  
    set "SollIst=%%e"  
    set "TeilC=%%~i %%~j  
    setlocal enabledelayedexpansion
    >>"%Aus%" echo %%c.%%a.%%b %%d ^| !SollIst::=! ^| A: %%~g ^| B: %%~h ^| C: !TeilC! ^| D: %%~k  
    endlocal
)
Grüße
bastla
Mitglied: 115129
115129 May 28, 2014 at 18:15:20 (UTC)
Goto Top
Vieeeelen Dank Bastla,

klappt nun wunderbar face-smile

Gruß,
Blattlaus
Mitglied: 115129
115129 Jun 16, 2014 at 19:24:22 (UTC)
Goto Top
Hallo,

ich habe doch noch ein kleines Anliegen.

Der Code funktioniert, jedoch schreibt er mir gleiche Zeilen mehrfach, von D:\Beispiel.log nach D:\Ausgabe.text.

Wäre es ein großer Aufwand, ein Vergleich mit einzubinden?

Wird z.B. die Zeile 05-26-2014 00:15:41 IST: "A1" "B2" "C3" "D4" "*@12f*543-.d6" durch D:\Beispiel.log eingelesen, zu 2014.05.26 00:15:41 | IST | A: B2 | B: C3 | C: D4 | D: *@12f*543-.d6 umstrukturiert, soll diese "nur" dann in D:\Ausgabe.text geschrieben werden wenn sie nicht existiert. Wenn doch, überspringen.

Hier mein derzeitiger Code:
@echo off & setlocal
set "Ein=D:\Beispiel.log"  
set "Aus=D:\Ausgabe.text"  

del "%Aus%" 2>nul  
for /f "tokens=1-10* delims=- " %%a in ('findstr /i "SOLL IST" "%Ein%"') do (  
    set "SollIst=%%e"  
    set "TeilC=%%~i %%~j  
    setlocal enabledelayedexpansion
    >>"%Aus%" echo %%c.%%a.%%b %%d ^| !SollIst::=! ^| A: %%~g ^| B: %%~h ^| C: !TeilC! ^| D: %%~k  
    endlocal
)
move "%Ein%" "%temp%\Ein.log"  
findstr /V "SOLL IST" "%temp%\Ein.log">"%Ein%"  
del "%temp%\Ein.log"  

Vielen Dank schonmal face-smile

Gruß,
Blattlaus
Member: bastla
bastla Jun 16, 2014 at 19:41:24 (UTC)
Goto Top
Hallo BlattlausOG!

Ungetestet:
@echo off & setlocal
set "Ein=D:\Beispiel.log"  
set "Aus=D:\Ausgabe.text"  

del "%Aus%" 2>nul  
for /f "tokens=1-10* delims=- " %%a in ('findstr /i "SOLL IST" "%Ein%"') do (  
    set "SollIst=%%e"  
    set "TeilC=%%~i %%~j  
    setlocal enabledelayedexpansion
    set "String=%%c.%%a.%%b %%d ^| !SollIst::=! ^| A: %%~g ^| B: %%~h ^| C: !TeilC! ^| D: %%~k"  
    findstr /c:"!String!" "%Aus%">nul||>>"%Aus%" echo !String!  
    endlocal
)
move "%Ein%" "%temp%\Ein.log"  
findstr /V "SOLL IST" "%temp%\Ein.log">"%Ein%"  
del "%temp%\Ein.log"  
Grüße
bastla