aiwa002
Goto Top

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

Content-ID: 173860

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

Ausgedruckt am: 22.11.2024 um 21:11 Uhr

bastla
bastla 28.09.2011 um 18:26:43 Uhr
Goto Top
Hallo aiwa002!

Ein wenig wenig konkret ...

Soll im Fall des Falles nur eine einzige Datei mit nur einem einzigen Eintrag erstellt werden?

Grüße
bastla
rubberman
rubberman 28.09.2011 um 18:29:01 Uhr
Goto Top
Hallo aiwa002.

Grundsätzlich ist es also egal, dass es sich um eine CSV Datei handelt. Solange im Dateiinhalt keine Nummern zwischen 1 und 9 auftauchen, ist die Welt in Ordnung face-wink
ungetestet:
findstr "[1-9]" "test.csv" >nul && >"error.txt" echo Werte gefunden  

Grüße
rubberman
Friemler
Friemler 28.09.2011 um 19:09:20 Uhr
Goto Top
Hallo aiwa002,

ich würde zu
findstr "[^0;]" "test.csv" > NUL && >"error.txt" echo Werte gefunden
raten, falls als Trennzeichen in der CSV das Semikolon benutzt wird.

Gruß
Friemler
rubberman
rubberman 28.09.2011 um 19:26:15 Uhr
Goto Top
Hallo Friemler,

what about
...;132.0;...

und was ist mit
... oder sind leer.


Grüße
rubberman
Friemler
Friemler 28.09.2011 um 19:33:52 Uhr
Goto Top
Hallo rubberman,

..;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 face-wink .

Leere Zellen würden in der CSV als zwei aufeinander folgende ; auftauchen. Das würde also nicht als Fund gelten.

Gruß
Friemler
aiwa002
aiwa002 28.09.2011 um 22:37:08 Uhr
Goto Top
Danke für die schnellen Antworten...

Das Ganze funktioniert soweit super, genau so brauch ich das Ganze.

Hat man hier eigentlich noch eine Möglichkeit um die Zeilen und Spalten
bei der Abfrage der CSV einzuschränken?
z.B. soll nur in den Spalten 2-4 und in den Zeilen 5-10 nach Werten
gesucht werden.

Gruß
aiwa002
Friemler
Friemler 28.09.2011 um 23:02:11 Uhr
Goto Top
Hallo aiwa002,

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 face-wink ). Wenn nur Zeilen, deren Zellen Nullen oder nichts enthalten, in der Eingabedatei vorhanden sind, existiert nach dem Scriptlauf keine Protokolldatei.

Gruß
Friemler
bastla
bastla 28.09.2011 um 23:10:23 Uhr
Goto Top
@Friemler
Die Variablen %BegCol% und %EndCol% sind aber eher Kosmetik, wenn Du danach mit %%b bis %%d genau 3 Spalten vorgibst ... face-wink

Außerdem: Unmittelbar aufeinander folgende CSV-Delimiter (also etwa ";;;;4") müsstest Du auch noch berücksichtigen ...

Grüße
bastla
Friemler
Friemler 28.09.2011 um 23:17:10 Uhr
Goto Top
Hallo bastla,

das fiel mir auch gerade auf. Ich wollte noch schnell ein entsprechendes EDIT schreiben und verkünden, dass ich mich darum heute nicht mehr kümmern kann, muss jetzt ins Bett. Evtl. kannst Du ja "übernehmen" face-wink .

N8
Friemler
rubberman
rubberman 28.09.2011 um 23:27:02 Uhr
Goto Top
Hallo Zusammen,

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"  
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
bastla
bastla 28.09.2011 um 23:42:11 Uhr
Goto Top
@Friemler
[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  
    )
  )
)
[/Edit]

[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
[/Edit2]

Grüße
bastla
aiwa002
aiwa002 30.09.2011 um 06:50:24 Uhr
Goto Top
Hat super geklappt!

Danke...