Zeilensuche in CSV
Moin Moin,
ich habe das Problem das in CSV Dateien Daten stehen die nach "DATUM UHRZEIT" (in einer Spalte) geordnet sind. Diese sind in 15 Minutenwerte gesplittet und für 7 Tage.
Davon habe ich 7 CSV Dateien.
Ich will die 23:45h Werte.
Problem an der ganzen Sache: Datei 1 hat 23:45, Datei 2 hat 23:45, Datei 3 hat 23:46, usw...
Ich habe mir nun gedacht in das ich mit IF Abfragen die Zeit bestimmen kann.
Mein Gedanke verlief folgendermaßen:
Ich habe das eingegebene Datum (Bsp.:18.02.2013, Das Datum in den Dateien ist nach MM.TT.JJJJ geordnert, die drehung der Zahlen ist schon gemacht) und die Festgelegte Zeit 23:45, 23:46, 23:47 usw.... Diesen Wert lass ich mit einer "Zeilen" suche abgleichen mit den einzelnen Zeilen.
Die Einzelnen Spalten sind mit ; getrennt.
Die Abfrage würde nun folgendermaßen - nach meinem Kopf - so aussehen:
das problem was ich nun habe: Wie bau ich den Zeilenvergleich? Da scheiter ich gedanklich total dran und komm nicht im ansatz an eine Lösung.
Falls ich das Script posten soll, sagt es, ist für den Teil an sich aber unwichtig.
Danke für eure Ansätze und Hilfe.
Gruß ColdZero
ich habe das Problem das in CSV Dateien Daten stehen die nach "DATUM UHRZEIT" (in einer Spalte) geordnet sind. Diese sind in 15 Minutenwerte gesplittet und für 7 Tage.
Davon habe ich 7 CSV Dateien.
Ich will die 23:45h Werte.
Problem an der ganzen Sache: Datei 1 hat 23:45, Datei 2 hat 23:45, Datei 3 hat 23:46, usw...
Ich habe mir nun gedacht in das ich mit IF Abfragen die Zeit bestimmen kann.
Mein Gedanke verlief folgendermaßen:
Ich habe das eingegebene Datum (Bsp.:18.02.2013, Das Datum in den Dateien ist nach MM.TT.JJJJ geordnert, die drehung der Zahlen ist schon gemacht) und die Festgelegte Zeit 23:45, 23:46, 23:47 usw.... Diesen Wert lass ich mit einer "Zeilen" suche abgleichen mit den einzelnen Zeilen.
Die Einzelnen Spalten sind mit ; getrennt.
Die Abfrage würde nun folgendermaßen - nach meinem Kopf - so aussehen:
IF "%DatumSAA1% 23:45"=="ZEILENVERGLEICH" set "Zeit=23:45"
IF "%DatumSAA1% 23:46"=="ZEILENVERGLEICH" set "Zeit=23:46"
IF "%DatumSAA1% 23:47"=="ZEILENVERGLEICH" set "Zeit=23:47"
IF "%DatumSAA1% 23:48"=="ZEILENVERGLEICH" set "Zeit=23:48"
IF "%DatumSAA1% 23:49"=="ZEILENVERGLEICH" set "Zeit=23:49"
das problem was ich nun habe: Wie bau ich den Zeilenvergleich? Da scheiter ich gedanklich total dran und komm nicht im ansatz an eine Lösung.
Falls ich das Script posten soll, sagt es, ist für den Teil an sich aber unwichtig.
Danke für eure Ansätze und Hilfe.
Gruß ColdZero
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 202565
Url: https://administrator.de/contentid/202565
Ausgedruckt am: 21.11.2024 um 17:11 Uhr
8 Kommentare
Neuester Kommentar
Hallo,
mach es statt als Batch-Datei mit einer Programmiersprache die Reguläre Ausdrücke kennt. Z.B: Suche nach, so geht es mit Perl, sollte mit VB ähnlich sein. Der Ausdruck bedeutet, dass nach "23:4x" gesucht wird, wobei x eine Ziffer von 0 bis 9 ist.
Wenn Du nun eine Variable brauchst, die nur die Zeit enthält, dann wäre das so weil $1 den Ausdruck innerhalb der Klammern enthält.
Markus
mach es statt als Batch-Datei mit einer Programmiersprache die Reguläre Ausdrücke kennt. Z.B: Suche nach
if ( $line =~ m/23:4\d/ )
Wenn Du nun eine Variable brauchst, die nur die Zeit enthält, dann wäre das so
if ( $line =~ m/(23:4\d)/ ) {
$zeit = $1 ;
}
Markus
Sorry, ich hatte gerade meine Antwort von oben nochmal angepasst weil ich Dich falsch verstanden hatte.
Frage: welche Daten brauchst Du denn? also wie sieht die Datenstruktur aus, die am Ende rauskommen soll? Vielleicht postest Du mal eine Beispielzeile aus der csv-Datei und dazu die Daten wie sie vorliegen sollen, wenn alles fertig ist.
Aber im Ernst, komplexe Dinge in Batch, das geht zwar, ist aber sehr unkomfortabel und fehleranfällig.
Markus
Frage: welche Daten brauchst Du denn? also wie sieht die Datenstruktur aus, die am Ende rauskommen soll? Vielleicht postest Du mal eine Beispielzeile aus der csv-Datei und dazu die Daten wie sie vorliegen sollen, wenn alles fertig ist.
Aber im Ernst, komplexe Dinge in Batch, das geht zwar, ist aber sehr unkomfortabel und fehleranfällig.
Markus
Jetzt sind alle Klarheiten beseitigt
Also Tipp, wenn Du die Datei mit Excel öffnest, dann mach alles in Excel. Das kann ja kein großes Problem sein, die benötigten Daten in Excel herauszusuchen.
Ansonsten, wenn es mit einem Skript gehen soll, dann wird man normalerweise die Datei zeilenweise mit ';' als Trenner splitten und in ein Array schreiben. Dann musst Du nur noch die passenden Einträge des Arrays (entsprechend den Spalten in der CSV-Datei bzw. Excel) bearbeiten. Es wäre dann z.B. Du musst Dir klar werden, welches Werkzeug Du benutzen möchtest, mit Batch kann ich nicht helfen.
Markus
Also Tipp, wenn Du die Datei mit Excel öffnest, dann mach alles in Excel. Das kann ja kein großes Problem sein, die benötigten Daten in Excel herauszusuchen.
Ansonsten, wenn es mit einem Skript gehen soll, dann wird man normalerweise die Datei zeilenweise mit ';' als Trenner splitten und in ein Array schreiben. Dann musst Du nur noch die passenden Einträge des Arrays (entsprechend den Spalten in der CSV-Datei bzw. Excel) bearbeiten. Es wäre dann z.B.
Array = Datum
Array[1] = Zeit
usw.
Markus
Hallo Zero,
teste mal folgendes:
Erläuterung:
Die
Die
Die
Ist die gefundene Minutenangabe größer oder gleich der gewünschten Minutenangabe, wird in Zeile 13 der Name der aktuellen CSV-Datei sowie die komplette Zeile ausgegeben.
Die
Datum und Uhrzeit müssen in der gleichen Zeile stehen.
Gruß
Friemler
teste mal folgendes:
@echo off & setlocal
set "BaseFolder=."
set "Files="file1.csv" "file2.csv" "file3.csv" "file4.csv" "file5.csv" "file6.csv" "file7.csv""
set "TheDate=10.30.2006"
set "Hour=23"
set "Minute=45"
for %%f in (%Files%) do (
for /f eol^=^ delims^= %%l in ('findstr /b /r /c:"%TheDate% %Hour%:" "%BaseFolder%\%%~f"') do (
for /f eol^=^ tokens^=^3^ delims^=^:^ %%m in ("%%l") do (
if %%m geq %Minute% echo %%~f: %%l
)
)
)
Erläuterung:
Variable BaseFolder (Zeile 3) | Das Verzeichnis, in dem die CSV-Dateien abgelegt sind. |
Variable Files (Zeile 4) | Die Liste der Dateinamen der zu untersuchenden CSV-Dateien, jeweils in Anführungszeichen eingeschlossen und durch Freizeichen voneinander getrennt. |
Variable TheDate (Zeile 6) | Das Datum in dem Format, wie es in den CSV-Dateien notiert ist. Die Variable darf nicht Date heißen,da es schon eine Systemvariable mit diesem Namen gibt. |
Variable Hour (Zeile 7) | Der Stundenanteil der gewünschten Uhrzeit. |
Variable Minute (Zeile 8) | Der Minutenanteil der gewünschten Uhrzeit. |
Die
For
-Schleife in Zeile 10 iteriert durch die Liste der Namen der CSV-Dateien.Die
FOR
-Schleife in Zeile 11 extrahiert aus der aktuellen CSV-Datei die Zeilen, die mit dem gewünschten Datum und einer Zeitangabe mit der gewünschten Stunde beginnen.Die
FOR
-Schleife in Zeile 12 extrahiert aus den gefundenen Zeilen die Minutenangabe.Ist die gefundene Minutenangabe größer oder gleich der gewünschten Minutenangabe, wird in Zeile 13 der Name der aktuellen CSV-Datei sowie die komplette Zeile ausgegeben.
Die
^
-Zeichen in den Köpfen der FOR
-Schleifen in Zeile 11 und 12 sind Escape-Zeichen, die in den Optionen-String (EOL= DELIMS=
usw.) der FOR
-Schleife eingefügt werden müssen, da die Optionen nicht in Anführungszeichen eingeschlossen sind. Das ist notwendig, um als EOL
(End Of Line) KEIN Zeichen festzulegen. Per Default ist das Semikolon als EOL
definiert, was bei einer CSV-Datei aber zu den Daten gehört und nicht interpretiert werden darf. Wir wollen auch kein anderes Zeichen als EOL
zulassen, das ist nur mit obiger Methode machbar. Siehe hier.Datum und Uhrzeit müssen in der gleichen Zeile stehen.
Gruß
Friemler