newplay123
Goto Top

Per batch datei CSV auslesen

Hallo, ich will mit einer Batch dabei eine .csv datei auslesen.
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

Content-ID: 456403

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

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

rubberman
rubberman 27.05.2019 aktualisiert um 22:11:37 Uhr
Goto Top
Leere Zeilen werden von FOR /F Schleifen ignoriert. Selbst wenn das nicht der Fall wäre - du prüfst mit if not definedob 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
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
erikro
erikro 28.05.2019 um 09:18:31 Uhr
Goto Top
Moin,

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.


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
Newplay123
Newplay123 29.05.2019 um 15:06:55 Uhr
Goto Top
Zitat von @rubberman:

Leere Zeilen werden von FOR /F Schleifen ignoriert. Selbst wenn das nicht der Fall wäre - du prüfst mit if not definedob 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
> 
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



Dann wird ja jetzt, wenn nichts in einer Zeile steht auch nichts ausgegeben.
Was muss ich machen, damit statt des nichts eine "0:00" ausgegeben wird für die Zeilen in den nichts drin steht ?

Jan
139920
139920 29.05.2019 aktualisiert um 15:16:12 Uhr
Goto Top
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 face-smile
https://stackoverflow.com/questions/23075953/batch-script-to-find-and-re ...
erikro
erikro 29.05.2019 um 15:11:43 Uhr
Goto Top
Moin,


mit der Powershell:

import-csv datei.csv -delimiter ";" -encoding utf8 | %{if($_.wieauchimmerdieSpalteheisst) {write-output $_.wieauchimmerdieSpalteheisst} else {write-output "0:00"}}  

hth

Erik
Newplay123
Newplay123 29.05.2019 um 16:19:39 Uhr
Goto Top
Zitat von @erikro:

Moin,


mit der Powershell:

> import-csv datei.csv -delimiter ";" -encoding utf8 | %{if($_.wieauchimmerdieSpalteheisst) {write-output $_.wieauchimmerdieSpalteheisst} else {write-output "0:00"}}  
> 

hth

Erik


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.

Jan
139920
139920 29.05.2019 aktualisiert um 16:39:48 Uhr
Goto Top
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.

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  
Newplay123
Newplay123 30.05.2019 um 13:09:38 Uhr
Goto Top
Zitat von @139920:

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.

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.

Jan
139920
Lösung 139920 30.05.2019 aktualisiert um 13:14:39 Uhr
Goto Top
Zitat von @Newplay123:

Zitat von @139920:

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.

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.
Na und wo ist das Problem, das ist doch ne Fingerübung, einfach mit Select die entsprechend benannte Spalte auswählen lassen:
[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  
https://www.google.com/search?q=Powershell+Tutorial
Newplay123
Newplay123 30.05.2019 um 15:06:47 Uhr
Goto Top
Zitat von @139920:

Zitat von @Newplay123:

Zitat von @139920:

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.

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.
Na und wo ist das Problem, das ist doch ne Fingerübung, einfach mit Select die entsprechend benannte Spalte auswählen lassen:
> [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  
> 
https://www.google.com/search?q=Powershell+Tutorial

Danke, hat super Funktioniert !!

Danke auch an alle anderen.

Jan