CSV Datei per Batch auslesen
Ich hab sowas bisher mit der Batchprogrammierung noch nicht umgesetzt,
und leider auch keine passende Anleitung gefunden.
Ich muss eine CSV Datei, welche aus 5 Spalten und 24 Zeilen besteht, auslesen.
Generell sind diese Zellen mit Nullwerten befüllt oder sind leer.
Ist das der Fall, dann ist nichts zu unternehmen.
Sollte jedoch ein Wert ungleich 0 sein, dann muss eine Textdatei (error.txt)
erzeugt werden, in der nur ein fester Wert z.B. "Werte gefunden" steht.
Ich hoffe das geht so umzusetzen!
Danke...
Gruß Steffen
und leider auch keine passende Anleitung gefunden.
Ich muss eine CSV Datei, welche aus 5 Spalten und 24 Zeilen besteht, auslesen.
Generell sind diese Zellen mit Nullwerten befüllt oder sind leer.
Ist das der Fall, dann ist nichts zu unternehmen.
Sollte jedoch ein Wert ungleich 0 sein, dann muss eine Textdatei (error.txt)
erzeugt werden, in der nur ein fester Wert z.B. "Werte gefunden" steht.
Ich hoffe das geht so umzusetzen!
Danke...
Gruß Steffen
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 173860
Url: https://administrator.de/contentid/173860
Ausgedruckt am: 05.11.2024 um 19:11 Uhr
12 Kommentare
Neuester Kommentar
Hallo rubberman,
Leere Zellen würden in der CSV als zwei aufeinander folgende
Gruß
Friemler
..;132.0;...
wird wegen der enthaltenen, von 0 verschiedenen Ziffern gefunden. Der Dezimalpunkt alleine würde aber auch schon ausreichen, ist ja schließlich keine 0 und auch kein Semikolon .Leere Zellen würden in der CSV als zwei aufeinander folgende
;
auftauchen. Das würde also nicht als Fund gelten.Gruß
Friemler
Hallo aiwa002,
teste mal folgendes:
Damit wird pro Zeile der CSV, die deinen Vorgaben nicht entspricht, eine Zeile in die Protokolldatei geschrieben, in der auch die Zeilennummer der betreffenden Zeile aus der CSV zu finden ist (das muss man evtl. zweimal lesen ). Wenn nur Zeilen, deren Zellen Nullen oder nichts enthalten, in der Eingabedatei vorhanden sind, existiert nach dem Scriptlauf keine Protokolldatei.
Gruß
Friemler
teste mal folgendes:
@echo off & setlocal
set "InFile=Test.csv"
set "Delim=;"
set "Protocol=error.txt"
set "BegLine=5"
set "EndLine=10"
set /a "BegCol=2+1"
set /a "EndCol=4+1"
del "%Protocol%" 2>NUL
for /f "tokens=1,%BegCol%-%EndCol% delims=:%Delim%" %%a in ('findstr /n "^" "%InFile%"') do (
if %%a geq %BegLine% if %%a leq %EndLine% (
<NUL set /p "=%%b%Delim%%%c%Delim%%%d" | findstr "[^0%Delim%]" > NUL && >>"%Protocol%" echo Werte gefunden in Zeile %%a
)
)
Damit wird pro Zeile der CSV, die deinen Vorgaben nicht entspricht, eine Zeile in die Protokolldatei geschrieben, in der auch die Zeilennummer der betreffenden Zeile aus der CSV zu finden ist (das muss man evtl. zweimal lesen ). Wenn nur Zeilen, deren Zellen Nullen oder nichts enthalten, in der Eingabedatei vorhanden sind, existiert nach dem Scriptlauf keine Protokolldatei.
Gruß
Friemler
@Friemler
Die Variablen %BegCol% und %EndCol% sind aber eher Kosmetik, wenn Du danach mit %%b bis %%d genau 3 Spalten vorgibst ...
Außerdem: Unmittelbar aufeinander folgende CSV-Delimiter (also etwa ";;;;4") müsstest Du auch noch berücksichtigen ...
Grüße
bastla
Die Variablen %BegCol% und %EndCol% sind aber eher Kosmetik, wenn Du danach mit %%b bis %%d genau 3 Spalten vorgibst ...
Außerdem: Unmittelbar aufeinander folgende CSV-Delimiter (also etwa ";;;;4") müsstest Du auch noch berücksichtigen ...
Grüße
bastla
Hallo Zusammen,
etwas anderer Ansatz:
Sieht zugegeben etwas komisch aus, aber SET /P in einem solchen Block liest tatsächlich Zeile für Zeile. Die erste FOR /L Schleife sorgt dafür, dass die ersten 4 Zeilen nicht berücksichtigt werden.
Grüße
rubberman
etwas anderer Ansatz:
@echo off &setlocal enabledelayedexpansion
(
for /l %%i in (1,1,4) do set /p "="
for /l %%i in (1,1,6) do (
set "line="
set /p "line="
set "line= !line:;= ; !"
for /f "tokens=2-4 delims=;" %%A in ("!line!") do (
echo(%%A%%B%%C|findstr "[1-9]" >nul && >error.txt echo Werte gefunden
)
)
)<"test.csv"
Grüße
rubberman
@Friemler
[Edit] Analog zu rubbermans Behandlung dieser Thematik sollte das so gehen:
[/Edit]
[Edit2] Meinen eigenen Ansatz hatte ich zwar schon auf Eis gelegt, aber da bisher die Spalten noch nicht variabel festgelegt wurden:
[/Edit2]
Grüße
bastla
[Edit] Analog zu rubbermans Behandlung dieser Thematik sollte das so gehen:
@echo off & setlocal enabledelayedexpansion
set "InFile=Test.csv"
set "Delim=;"
set "Protocol=error.txt"
set "BegLine=5"
set "EndLine=10"
set "BegCol=2"
set "EndCol=4"
del "%Protocol%" 2>NUL
for /f "tokens=1,* delims=:" %%i in ('findstr /n "^" "%InFile%"') do (
if %%i geq %BegLine% if %%i leq %EndLine% (
set "Line=%%j"
for /f "tokens=%BegCol%-%EndCol% delims=%Delim%" %%b in ("!Line:%Delim%= %Delim% !") do (
<NUL set /p "=%%b%Delim%%%c%Delim%%%d"|findstr /r /c:"[^0%Delim% ]" > NUL && >>"%Protocol%" echo Werte gefunden in Zeile %%i
)
)
)
[Edit2] Meinen eigenen Ansatz hatte ich zwar schon auf Eis gelegt, aber da bisher die Spalten noch nicht variabel festgelegt wurden:
@echo off & setlocal enabledelayedexpansion
set "Datei=test.csv"
set "Delim=;"
set "Error=error.txt"
set "VonZeile=5"
set "BisZeile=10"
set "VonSpalte=2"
set "BisSpalte=4"
del "%Error%" 2>nul
for /f "tokens=1* delims=:" %%a in ('findstr /n "^" "%Datei%"') do if %%a geq %VonZeile% if %%a leq %BisZeile% echo %%b|findstr "[^0%Delim%]"> NUL && (set "Zeile=%%b" & call :ProcessLine %%a)
goto :eof
:ProcessLine
set "Zeile=%Zeile: =%"
set "Zeile=!Zeile:%Delim%=0 !"
set /a SpNr=1
for %%i in (%Zeile%) do (
if !SpNr! geq %VonSpalte% if !SpNr! leq %BisSpalte% if %%i gtr 0 echo Wert gefunden: Zeile %1 Spalte !SpNr!
set /a SpNr+=1
)>>"%Error%"
goto :eof
Grüße
bastla