Batch Findstr für Batch

batch_prog

Cadet 2nd Year
Registriert
März 2017
Beiträge
27
Hallo, wer kann mir hier helfen?
Ich habe eine Batch, die die Zeile übertragen soll, wenn in Spalte nur der Wert gleich 10 11 12 usw. steht, sonst soll er die Zeile nicht übertragen. Wer hat ne Idee woran es liegt?

@echo off &setlocal
set"quelle=%userprofile%\Desktop\TEST\quelle.csv"
set "ziel=%userprofile%\Desktop\TEST\ziel.txt"
>"%ziel%" (for /f "usebackq skip=1 tokens=1-31 delims=," %%a in ("%quelle%") DO (
echo(%%d | findstr /i "^10$ ^11$ ^12$ ^13$ ^14$ ^18$ ^19$ ^21$ ^22$ ^25$ ^30$ ^31$" >nul 2>&1 && (
echo(%%ae;1;
)
)
))
 
batch_prog schrieb:
Hallo, wer kann mir hier helfen?
Ich habe eine Batch, die die Zeile übertragen soll, wenn in Spalte nur der Wert gleich 10 11 12 usw. steht, sonst soll er die Zeile nicht übertragen. Wer hat ne Idee woran es liegt? [...]

Woran was liegt?

Code:
findstr /i "^10$ ^11$ ^12$ ^13$ ^14$ ^18$ ^19$ ^21$ ^22$ ^25$ ^30$ ^31$"

/i steht für case-insensitiv. Unnötig, da nur nach Ziffern gesucht wird.
Das Suchmuster "^10$ ^11$ ^12$ ..."
- findet Zeilen, in denen genau "10" steht: ^Zeilenanfang"10"$Zeilenende
- jedoch ...
- soll nach dem Zeilenende noch ein Leerzeichen folgen
- dann ein zweiter Zeilenanfang ^, dann "11" und ein weiteres Zeilenende $
- usw.
Kann nicht funktionieren.

Wenn das Suchmuster korrekt wäre, würde es immer noch nicht funktionieren.
- mit "for /f" wählst du Spalten aus
- und fasst sie zu einer geschrumpften Zeile zusammen
- mit findstr wählst du dann einige dieser geschrumpften Zeilen aus
Nicht die Originalzeilen wie eigentlich gewünscht.

Ich würde entweder "for /f" oder findstr benutzen, aber nicht beides gleichzeitig:
"for /f"
- gesuchte Spalten auswählen (tokens=1-31)
- mit erwartetem "Schrumpf"-Ergebnis vergleichen
- wenn identisch, die Originalzeile rausschreiben
findstr
- ein Suchmuster entwickeln, das gewünschte Spalten und deren Inhalt trifft
- findstr schreibt Trefferzeilen raus

Mein Vorschlag zur Vorgehensweise:
1. Version: finde alle Zeilen, die "10" enthalten
2. Version: finde alle Zeilen, die mit "10" beginnen
3. Version: finde alle Zeilen, die "11" in der zweiten Spalte enthalten
Von da an sollte es ein Selbstläufer sein.
 
Hi, würde die 3. Version auch mit mehreren funktionieren?
Also: finde alle Zeilen, die "11" oder "12" oder "13" usw in der vierten Spalte enthalten und übertrage dann aus der jeweilige Zeile, den Wert aus Spalte AE;1; in eine .txt?

Würde sowas klappen?
 
Mit den Versionen wollte ich nur die Vorgehensweise beschreiben wie man zu einem Ergebnis kommt. D.h. nicht direkt versuchen, die Lösung hin zu schreiben, sondern erstmal klein anfangen, sehen, dass es funktioniert, und dann Schritt für Schritt sich weiter vorarbeiten.

Zur Frage.
Wie man hier sieht kennt findstr kein Metazeichen für die Alternation, die Oder-Verknüpfung. Normalerweise ist das "a|b". Das Suchmuster "1[0-489]" findet "10", "11", "12", "13, "14", "18", "19", funktioniert aber beim Rest "21", "22" usw. nicht mehr.

Wenn es um genau eine Spalte geht, könntest du die mit findstr oder mit "for /f" ausschneiden, im Batch-Skript auswerten/vergleichen und so per IF-Anweisung die passenden Originalzeilen auswählen.

Irgendwie so:
Code:
for %%S in ("10" "11" "21" "22" "31") do if "%SPALTE%" == %%S do echo "%ORIGINAL_ZEILE%"
 
Zurück
Oben