Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

CSV Datei per Batch auslesen

Frage Entwicklung Batch & Shell

Mitglied: aiwa002

aiwa002 (Level 1) - Jetzt verbinden

28.09.2011, aktualisiert 29.09.2011, 5186 Aufrufe, 12 Kommentare, 1 Danke

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
Mitglied: bastla
28.09.2011 um 18:26 Uhr
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
Bitte warten ..
Mitglied: rubberman
28.09.2011 um 18:29 Uhr
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
ungetestet:
01.
findstr "[1-9]" "test.csv" >nul && >"error.txt" echo Werte gefunden
Grüße
rubberman
Bitte warten ..
Mitglied: Friemler
28.09.2011 um 19:09 Uhr
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
Bitte warten ..
Mitglied: rubberman
28.09.2011 um 19:26 Uhr
Hallo Friemler,

what about
...;132.0;...

und was ist mit
... oder sind leer.


Grüße
rubberman
Bitte warten ..
Mitglied: Friemler
28.09.2011 um 19:33 Uhr
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 .

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

Gruß
Friemler
Bitte warten ..
Mitglied: aiwa002
28.09.2011 um 22:37 Uhr
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
Bitte warten ..
Mitglied: Friemler
28.09.2011 um 23:02 Uhr
Hallo aiwa002,

teste mal folgendes:
01.
@echo off & setlocal 
02.
 
03.
 
04.
set "InFile=Test.csv" 
05.
set "Delim=;" 
06.
 
07.
set "Protocol=error.txt" 
08.
 
09.
set "BegLine=5" 
10.
set "EndLine=10" 
11.
 
12.
set /a "BegCol=2+1" 
13.
set /a "EndCol=4+1" 
14.
 
15.
 
16.
del "%Protocol%" 2>NUL 
17.
 
18.
for /f "tokens=1,%BegCol%-%EndCol% delims=:%Delim%" %%a in ('findstr /n "^" "%InFile%"') do ( 
19.
  if %%a geq %BegLine% if %%a leq %EndLine% ( 
20.
    <NUL set /p "=%%b%Delim%%%c%Delim%%%d" | findstr "[^0%Delim%]" > NUL && >>"%Protocol%" echo Werte gefunden in Zeile %%a 
21.
22.
)
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
Bitte warten ..
Mitglied: bastla
28.09.2011 um 23:10 Uhr
@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
Bitte warten ..
Mitglied: Friemler
28.09.2011 um 23:17 Uhr
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" .

N8
Friemler
Bitte warten ..
Mitglied: rubberman
28.09.2011 um 23:27 Uhr
Hallo Zusammen,

etwas anderer Ansatz:
01.
@echo off &setlocal enabledelayedexpansion 
02.
03.
  for /l %%i in (1,1,4) do set /p "=" 
04.
  for /l %%i in (1,1,6) do ( 
05.
    set "line=" 
06.
    set /p "line=" 
07.
    set "line= !line:;= ; !" 
08.
    for /f "tokens=2-4 delims=;" %%A in ("!line!") do ( 
09.
      echo(%%A%%B%%C|findstr "[1-9]" >nul && >error.txt echo Werte gefunden 
10.
11.
12.
)<"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
Bitte warten ..
Mitglied: bastla
28.09.2011 um 23:42 Uhr
@Friemler
[Edit] Analog zu rubbermans Behandlung dieser Thematik sollte das so gehen:
01.
@echo off & setlocal enabledelayedexpansion 
02.
 
03.
set "InFile=Test.csv" 
04.
set "Delim=;" 
05.
 
06.
set "Protocol=error.txt" 
07.
 
08.
set "BegLine=5" 
09.
set "EndLine=10" 
10.
 
11.
set "BegCol=2" 
12.
set "EndCol=4" 
13.
 
14.
del "%Protocol%" 2>NUL 
15.
 
16.
for /f "tokens=1,* delims=:" %%i in ('findstr /n "^" "%InFile%"') do ( 
17.
  if %%i geq %BegLine% if %%i leq %EndLine% ( 
18.
    set "Line=%%j" 
19.
    for /f "tokens=%BegCol%-%EndCol% delims=%Delim%" %%b in ("!Line:%Delim%= %Delim% !") do ( 
20.
      <NUL set /p "=%%b%Delim%%%c%Delim%%%d"|findstr /r /c:"[^0%Delim% ]" > NUL && >>"%Protocol%" echo Werte gefunden in Zeile %%i 
21.
22.
23.
)
[/Edit]

[Edit2] Meinen eigenen Ansatz hatte ich zwar schon auf Eis gelegt, aber da bisher die Spalten noch nicht variabel festgelegt wurden:
01.
@echo off & setlocal enabledelayedexpansion 
02.
set "Datei=test.csv" 
03.
set "Delim=;" 
04.
 
05.
set "Error=error.txt" 
06.
 
07.
set "VonZeile=5" 
08.
set "BisZeile=10" 
09.
set "VonSpalte=2" 
10.
set "BisSpalte=4" 
11.
 
12.
del "%Error%" 2>nul 
13.
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) 
14.
goto :eof 
15.
 
16.
:ProcessLine 
17.
set "Zeile=%Zeile: =%" 
18.
set "Zeile=!Zeile:%Delim%=0 !" 
19.
set /a SpNr=1 
20.
for %%i in (%Zeile%) do ( 
21.
    if !SpNr! geq %VonSpalte% if !SpNr! leq %BisSpalte% if %%i gtr 0 echo Wert gefunden: Zeile %1 Spalte !SpNr! 
22.
    set /a SpNr+=1 
23.
)>>"%Error%"  
24.
goto :eof
[/Edit2]

Grüße
bastla
Bitte warten ..
Mitglied: aiwa002
30.09.2011 um 06:50 Uhr
Hat super geklappt!

Danke...
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

Windows Systemdateien
gelöst Registry-Schlüssel per Batch auslesen und in Datei schreiben (9)

Frage von Philzip zum Thema Windows Systemdateien ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...