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-Key: 173860

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

Printed on: April 19, 2024 at 17:04 o'clock

Member: bastla
bastla Sep 28, 2011 at 16:26:43 (UTC)
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
Member: rubberman
rubberman Sep 28, 2011 at 16:29:01 (UTC)
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
Member: Friemler
Friemler Sep 28, 2011 at 17:09:20 (UTC)
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
Member: rubberman
rubberman Sep 28, 2011 at 17:26:15 (UTC)
Goto Top
Hallo Friemler,

what about
...;132.0;...

und was ist mit
... oder sind leer.


Grüße
rubberman
Member: Friemler
Friemler Sep 28, 2011 at 17:33:52 (UTC)
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
Member: aiwa002
aiwa002 Sep 28, 2011 at 20:37:08 (UTC)
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
Member: Friemler
Friemler Sep 28, 2011 at 21:02:11 (UTC)
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
Member: bastla
bastla Sep 28, 2011 at 21:10:23 (UTC)
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
Member: Friemler
Friemler Sep 28, 2011 at 21:17:10 (UTC)
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
Member: rubberman
rubberman Sep 28, 2011 at 21:27:02 (UTC)
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
Member: bastla
bastla Sep 28, 2011 at 21:42:11 (UTC)
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
Member: aiwa002
aiwa002 Sep 30, 2011 at 04:50:24 (UTC)
Goto Top
Hat super geklappt!

Danke...