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

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

Printed on: May 4, 2024 at 23:05 o'clock

Member: rubberman
rubberman May 27, 2019 updated at 20:11:37 (UTC)
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
Member: erikro
erikro May 28, 2019 at 07:18:31 (UTC)
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
Member: Newplay123
Newplay123 May 29, 2019 at 13:06:55 (UTC)
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
Mitglied: 139920
139920 May 29, 2019 updated at 13:16:12 (UTC)
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 ...
Member: erikro
erikro May 29, 2019 at 13:11:43 (UTC)
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
Member: Newplay123
Newplay123 May 29, 2019 at 14:19:39 (UTC)
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
Mitglied: 139920
139920 May 29, 2019 updated at 14:39:48 (UTC)
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  
Member: Newplay123
Newplay123 May 30, 2019 at 11:09:38 (UTC)
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
Mitglied: 139920
Solution 139920 May 30, 2019 updated at 11:14:39 (UTC)
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
Member: Newplay123
Newplay123 May 30, 2019 at 13:06:47 (UTC)
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