Per batch datei CSV auslesen
Hallo, ich will mit einer Batch dabei eine .csv datei auslesen.
Dafür benutzt ich diesen Code:
In der CSV datei stehen (über excel geöffnet) dabei in der 7. Spalte die Uhrzeiten.
Die Tabelle sieht ungefähr so aus
1.Zeile 16:00
2.Zeile 14:32
3.Zeile (nichts)
4.Zeile 17:00
wenn ich jetzt sage ich will, den wert von Zeile1 herausfinden,dann kommt am Ende auch "16:00" raus, wenn ich aber Zeile3 auswähle, dann kommt auf einmal "17:00" raus, obwohl dies erst in Zeile4 steht. Wenn ich jetzt Zeile4 auswähle kommt auch hier (diesmal ist es ja richt) die "17:00" raus. Warum sagt er für leere Zeilen immer das an was in der nächst beschriebenden Zeile darunterstehend an?
Egal wieviele Zeilen dazwischen sind.
Das gleiche hab ich auch in Spalte6 stehen, hier funktioniert es aber und für leere Zeilen gibt er hier "0:00" raus.
Mit freundlichen Grüßen,
Newplay123
Dafür benutzt ich diesen Code:
@echo off
:einmal
echo Line:
set /P Line=Line:
set LineNo=%Line%
set ColNo=7
set "Hinein="
set /a LineNo-=1
for /f "delims=; tokens=%ColNo%" %%a in ('more/e +%LineNo% ^< C:\Users\jafrd\ST_Programm\TEMP\import_30.csv') do (
if not defined Hinein set "Hinein=%%a"
)
set Hinein=%Hinein%
echo %Hinein%
goto einmal
In der CSV datei stehen (über excel geöffnet) dabei in der 7. Spalte die Uhrzeiten.
Die Tabelle sieht ungefähr so aus
1.Zeile 16:00
2.Zeile 14:32
3.Zeile (nichts)
4.Zeile 17:00
wenn ich jetzt sage ich will, den wert von Zeile1 herausfinden,dann kommt am Ende auch "16:00" raus, wenn ich aber Zeile3 auswähle, dann kommt auf einmal "17:00" raus, obwohl dies erst in Zeile4 steht. Wenn ich jetzt Zeile4 auswähle kommt auch hier (diesmal ist es ja richt) die "17:00" raus. Warum sagt er für leere Zeilen immer das an was in der nächst beschriebenden Zeile darunterstehend an?
Egal wieviele Zeilen dazwischen sind.
Das gleiche hab ich auch in Spalte6 stehen, hier funktioniert es aber und für leere Zeilen gibt er hier "0:00" raus.
Mit freundlichen Grüßen,
Newplay123
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 456403
Url: https://administrator.de/contentid/456403
Ausgedruckt am: 22.11.2024 um 15:11 Uhr
10 Kommentare
Neuester Kommentar
Leere Zeilen werden von FOR /F Schleifen ignoriert. Selbst wenn das nicht der Fall wäre - du prüfst mit
Probiere:
CSV Daten mit Batch zu parsen ist und bleibt riskant. Bei leeren Datenfeldern folgen Semikola aufeinander, die aber von FOR /F wie ein einzelnes Trennzeichen behandelt werden und die Anzahl Tokens durcheinander bringt.
Steffen
if not defined
ob die Variable definiert wurde. Was sollte dann bei einer Leerzeile passieren? Sie bleibt undefiniert, sodass die nächste Zeile gelesen werden würde.Probiere:
@echo off &setlocal
:einmal
set /p "LineNo=Line: "
set /a "ColNo=7, LineNo-=1"
set "Hinein="
set "Skip="
if %LineNo% gtr 0 set "Skip=skip=%LineNo% "
for /f "%Skip%tokens=1,%ColNo% delims=;" %%a in ('findstr /n "^" "test.csv"') do (
set "Hinein=%%b"
goto end_for
)
:end_for
echo(%Hinein%
goto einmal
Steffen
Moin,
Jo und anstrengend, nervig, fehleranfällig ... Deshalb sollte man dafür die Powershell nehmen. Da sieht das dann (ungefähr) so aus:
Schlanker, schneller und leere Datenfelder stören nicht weiter.
hth
Erik
Zitat von @rubberman:
CSV Daten mit Batch zu parsen ist und bleibt riskant. Bei leeren Datenfeldern folgen Semikola aufeinander, die aber von FOR /F wie ein einzelnes Trennzeichen behandelt werden und die Anzahl Tokens durcheinander bringt.
CSV Daten mit Batch zu parsen ist und bleibt riskant. Bei leeren Datenfeldern folgen Semikola aufeinander, die aber von FOR /F wie ein einzelnes Trennzeichen behandelt werden und die Anzahl Tokens durcheinander bringt.
Jo und anstrengend, nervig, fehleranfällig ... Deshalb sollte man dafür die Powershell nehmen. Da sieht das dann (ungefähr) so aus:
import-csv datei.csv -delimiter ";" -encoding utf8 | %{write-output $_.wieauchimmerdieSpalteheisst}
Schlanker, schneller und leere Datenfelder stören nicht weiter.
hth
Erik
Was muss ich machen, damit statt des nichts eine "0:00" ausgegeben wird für die Zeilen in den nichts drin steht ?
Indem du vorher per Skript alle direkt aufeinander folgenden Semikolons (;;) durch ;0:00; ersetzt https://stackoverflow.com/questions/23075953/batch-script-to-find-and-re ...
Zitat von @Newplay123:
sorry das ich nochmal frage , aber wie kann ich damit jede einzelne Zeile in variablen abspeichern ? Ich will sie nicht nur ausgeben, sondern jede einzelne zeile abspeichern.
sorry das ich nochmal frage , aber wie kann ich damit jede einzelne Zeile in variablen abspeichern ? Ich will sie nicht nur ausgeben, sondern jede einzelne zeile abspeichern.
Die Daten stehen ja in einem Array, die Daten kannst du ganz einfach über den Index ansprechen, Powershell ist ja im Gegensatz zu Batch eine Objektorientierte sprache:
[int]$line = read-host "Zeile eingeben"
$csv = import-csv datei_rein.csv -delimiter ";"
$csv[($line - 1)] | ConvertTo-Csv -NoType -Delimiter ";" | select -Skip 1 | Set-Content datei_raus.csv
Zitat von @Newplay123:
Aber das gibt mir ja eine Zeile immer raus. Ich brauche aber das ich jedes Feld einzeln ausgeben kann. Das ich also Zeile, aber auch Spalte definieren kann.
Na und wo ist das Problem, das ist doch ne Fingerübung, einfach mit Select die entsprechend benannte Spalte auswählen lassen:Zitat von @139920:
Die Daten stehen ja in einem Array, die Daten kannst du ganz einfach über den Index ansprechen, Powershell ist ja im Gegensatz zu Batch eine Objektorientierte sprache:
Zitat von @Newplay123:
sorry das ich nochmal frage , aber wie kann ich damit jede einzelne Zeile in variablen abspeichern ? Ich will sie nicht nur ausgeben, sondern jede einzelne zeile abspeichern.
sorry das ich nochmal frage , aber wie kann ich damit jede einzelne Zeile in variablen abspeichern ? Ich will sie nicht nur ausgeben, sondern jede einzelne zeile abspeichern.
Die Daten stehen ja in einem Array, die Daten kannst du ganz einfach über den Index ansprechen, Powershell ist ja im Gegensatz zu Batch eine Objektorientierte sprache:
>> [int]$line = read-host "Zeile eingeben"
>> $csv = import-csv datei_rein.csv -delimiter ";"
>> $csv[($line - 1)] | ConvertTo-Csv -NoType -Delimiter ";" | select -Skip 1 | Set-Content datei_raus.csv
>>
Aber das gibt mir ja eine Zeile immer raus. Ich brauche aber das ich jedes Feld einzeln ausgeben kann. Das ich also Zeile, aber auch Spalte definieren kann.
[int]$line = read-host "Zeile eingeben"
$spaltenname = read-host "Name der Spaltenüberschrift eingeben(nicht den Index)"
$csv = import-csv datei_rein.csv -delimiter ";"
$csv[($line - 1)] | select -Property $spaltenname | ConvertTo-Csv -NoType -Delimiter ";" | select -Skip 1 | Set-Content datei_raus.csv