Eine Tabelle aus einer großen CSV exportieren
Ich habe gesehen das du ein Meister der batchdateien bist. Ich habe dort ein kleines Problem mit einer, ich möchte gerne aus einer CSV eine bestimmte Tabelle seperat in eine Datei schreiben. In dieser Tabelle befinden sich bildnahmen welche ich später durch eine schleife automatisch kopieren will. Leider hat die CSV recht viele Spalten sodass ich es nicht geschaft bekomme saubere daten zu bekommen. Das problem schein darin zu liegen das verschiedene Felder nicht ausgefüllt sind und so teilweise ignoriert werden, meien Spalte ist die 60ste in der Tabelle... Setze ich die Tabelle auf spalte 1 oder 7 z. b. habe ich auch die Daten drin. Aber je weiter hinter das geht umso schlimmer wird es. in meinem Falle nun wird keine Datei mehr angezeigt.
Was kann ich denn nun tun?
for /f "tokens=60,61,61 delims=;" %%a in (muster.csv) do echo %%a>>test.csv
Oder kann ich auch nach Feldnamen gehen....?
vielen dank
Was kann ich denn nun tun?
for /f "tokens=60,61,61 delims=;" %%a in (muster.csv) do echo %%a>>test.csv
Oder kann ich auch nach Feldnamen gehen....?
vielen dank
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 181219
Url: https://administrator.de/contentid/181219
Ausgedruckt am: 22.11.2024 um 16:11 Uhr
39 Kommentare
Neuester Kommentar
Hallo chrislm und willkommen im Forum (ja, wir mögen hier eine - zumindest kurze - Begrüßung)!
Abgesehen von der Tatsache, dass "
Und nur zur Sicherheit: Es geht ausschließlich um die Spalte 60?
Ansonsten: Gibt es irgend einen Einwand Deinerseits gegen die Verwendung von VBS (zur Not auch innerhalb eines Batches)?
Grüße
bastla
Abgesehen von der Tatsache, dass "
for /f
" keine 60 Tokens verwenden kann, wäre es sinnvoll, zumindest eine Beispielzeile (in "Code" zu posten, damit ersichtlich wird, welche Daten (insbes auch hinsichtlich Sonderzeichen) enthalten sind ...Und nur zur Sicherheit: Es geht ausschließlich um die Spalte 60?
Ansonsten: Gibt es irgend einen Einwand Deinerseits gegen die Verwendung von VBS (zur Not auch innerhalb eines Batches)?
Grüße
bastla
Hallo chrislm!
Na dann:
Grüße
bastla
Na dann:
Ein = "muster.csv"
Aus = "test.csv"
Delim = ";"
FeldNr = 60
Set fso = CreateObject("Scripting.FileSystemObject")
Zeilen = Split(fso.OpenTextFile(Ein).ReadAll, vbCrLf)
For Each Zeile In Zeilen
T = T & vbCrLf & Split(Zeile, Delim)(FeldNr - 1)
Next
fso.CreateTextFile(Aus).Write Mid(T, 3)
bastla
@skye
Zum Thema nicht ausgefüllte Spalte könntest Du ja in ähnlichen Fällen etwa so vorgehen:
Grüße
bastla
Zum Thema nicht ausgefüllte Spalte könntest Du ja in ähnlichen Fällen etwa so vorgehen:
... set "Zeile=%%i" & call :ProcessLine
...
:ProcessLine
set "Zeile=%Zeile:;;=; ;%"
set "Zeile=%Zeile:;;=; ;%"
for /f "tokens=15 delims=;" %%i in ("%Zeile%") do echo %%i
bastla
Hallo chrislm!
Das dürfte daran liegen, dass sich am Ende der letzten Zeile noch ein Zeilenumbruch befindet (eine Zeile, deren Feldanzahl nicht stimmt, sollte es ja wohl nicht geben) - sollte dann aber so gehen:
Grüße
bastla
Das dürfte daran liegen, dass sich am Ende der letzten Zeile noch ein Zeilenumbruch befindet (eine Zeile, deren Feldanzahl nicht stimmt, sollte es ja wohl nicht geben) - sollte dann aber so gehen:
Ein = "muster.csv"
Aus = "test.csv"
Delim = ";"
FeldNr = 60
Set fso = CreateObject("Scripting.FileSystemObject")
Zeilen = Split(fso.OpenTextFile(Ein).ReadAll, vbCrLf)
For Each Zeile In Zeilen
If Trim(Zeile) <> "" Then T = T & vbCrLf & Split(Zeile, Delim)(FeldNr - 1)
Next
fso.CreateTextFile(Aus).Write Mid(T, 3)
bastla
Aloha bastla,
ja, kam mir auch der Gedanke ABER wenn die Zeile jetzt mit ";" anfängt, dann tut sich mit der Schleife so oder so nichts, da kann ich drehen wie ich will, Zeilen, die mit Semikolon beginnen, ignoriert er, selbst wenn ich kackedreist mit
Da ich darauf keine Lösung bisher fand, ließ ich es ganz, theoretisch sollte aber Spalte eins ja gefüllt sein, also könnte man schon
durcharbeiten lassen
greetz André
ja, kam mir auch der Gedanke ABER wenn die Zeile jetzt mit ";" anfängt, dann tut sich mit der Schleife so oder so nichts, da kann ich drehen wie ich will, Zeilen, die mit Semikolon beginnen, ignoriert er, selbst wenn ich kackedreist mit
'findstr /B ";" "datei.csv"'
arbeite, ohne Schleife gibt er mir die Zeile aus, mit Schleife wird "Zeile=
" und das war's.Da ich darauf keine Lösung bisher fand, ließ ich es ganz, theoretisch sollte aber Spalte eins ja gefüllt sein, also könnte man schon
siehe unten
greetz André
@skye
ein anderes EOL-Zeichen fest ...
Grüße
bastla
Zeilen, die mit Semikolon beginnen, ignoriert er
... es sei denn, Du legst mitfor /f "eol=§ tokens=31,* delims=;" %%m ...
Grüße
bastla
Hallo chrislm!
Dann etwa so (wobei es den Zielordner schon geben muss und keine gleichnamigen Dateien im Zielordner existieren dürfen):
Grüße
bastla
Dann etwa so (wobei es den Zielordner schon geben muss und keine gleichnamigen Dateien im Zielordner existieren dürfen):
Ein = "muster.csv"
Quelle = "P:\bilderarchiv\" '\ am Ende beachten
Ziel = "c:\bilder\" '\ am Ende beachten
Delim = ";"
FeldNr = 60
Set fso = CreateObject("Scripting.FileSystemObject")
Zeilen = Split(fso.OpenTextFile(Ein).ReadAll, vbCrLf)
For Each Zeile In Zeilen
If Trim(Zeile) <> "" Then fso.CopyFile Quelle & Replace(Split(Zeile, Delim)(FeldNr - 1), """", ""), Ziel
Next
bastla
moin bastla &andré,
also ich habe das Jetzt mal so zusammengefasst
PS.
... solte immer in der Schleife funktionieren
Gruß Phil
also ich habe das Jetzt mal so zusammengefasst
@echo off &setlocal disabledelayedexpansion
:: echo on
set "InFile=D:\Testordner\Datei.csv"
set "OutFile="
set "Cells=20 45 50 60 61 62 63 64 65 70 80 90"
if defined Outfile (set "Um=>") else set "Um="
%Um% %OUTFILE% (
for /f usebackqDelims^=^ eol^= %%i in ("%Infile%") do (
set Line="%%i"
set "cell=0"
set "incell=0"
set "check=1"
call :ReadCell %cells%
echo(
)
)
if not defined OutFile >&3 pause
goto :eof
:ReadCell
if %incell% neq 0 if %incell% equ %1 (
<nul set /p ="
if "%2" equ "" goto :eof
<nul set /p =";"
set /a "cell =%2-%1"
shift
)
if %cell% equ 0 set /a cell =%1
2>nul set /a x=1/((cell-1)/30) && set /a Cell -=30 , Token=30 || set /a Token=Cell
set /a incell +=Token
setlocal enabledelayedexpansion
if defined check set "Line=!Line:;=";"!"
for /f "Tokens=%Token%* delims=;" %%a in ("!Line!") do endlocal&(set "Line=%%b"
if %incell% equ %1 <nul set /p ="%%~a"
set "ChecK="
goto :ReadCell
)
PS.
for /f "delims=" %%i in ('findstr /n "^" "datei.csv"') do (set Line=%%i
set "Line=!Line:*:=!"
call untenrum
)
Gruß Phil
Aloha bastla,
ach dammit, stimmt ja, dieses gottverdammte Semikolon ist ja der default bei
Ich dreh voll am Rad, mich macht die cmd heute so gaga und fertig, den Passierschein A-38 bitte *wuaaaaaaaargh*
ich verstehe es nicht,. die Zeile wird immer "
edit: *brabbel*
edit: siehe bastlas Kommentar
edit: siehe Phils Kommentar
ach dammit, stimmt ja, dieses gottverdammte Semikolon ist ja der default bei
eol
, meine Fresse, was die Redmonder Praktikanten sich dabei gedacht haben, ist mir schleierhaft.Ich dreh voll am Rad, mich macht die cmd heute so gaga und fertig, den Passierschein A-38 bitte *wuaaaaaaaargh*
@echo off & setlocal
for /f usebackqDelims^=^ eol^= %%s in ("datei.csv") do (
set "Zeile=%%s"
echo %%s^|findstr /B ";">nul && set "Zeile= %%s"
call :Ablauf
)
pause
goto :eof
:Ablauf
set "Zeile=%Zeile:;;=; ;%"
set "Zeile=%Zeile:;;=; ;%"
for /f "tokens=31,* delims=;" %%m in ("%Zeile%") do call :Bereich "%%n"
goto :eof
:Bereich
for /f "tokens=29,* delims=;" %%i in (%1) do echo %%i>>"neu.csv"
goto :eof
%%s
", ich habe erst versucht im Ablauf set "Zeile= %Zeile%"
, ja hat er wunderbar im set
übernommen, war ihm in der Schleife dann aber wieder ###egal, sodass die Tokens nicht stimmten, also ewig rumgebastelt, momentan passen die Tokens aber eigentlich ist es nicht korrekt und wenn ichecho %1|findstr /B ";">nul && set "Zeile= %1"
in den Ablauf reinnehme (mit der Anpassung beim call
), ist es ihm auch wieder ###egal ... ich blick's nicht, ehrlichedit: *brabbel*
edit: siehe bastlas Kommentar
edit: siehe Phils Kommentar
Aloha bastla,
FUUUUUUUUUUUUUU (kennst du das passende Bild dazu?) der cmd
das ist so hirnverbrannt, dass es wirklich nur in der folgenden Konstellation funktioniert:
*brabbel* was ich alles an Möglichkeiten mit
Danke & greetz
André
FUUUUUUUUUUUUUU (kennst du das passende Bild dazu?) der cmd
das ist so hirnverbrannt, dass es wirklich nur in der folgenden Konstellation funktioniert:
*brabbel* was ich alles an Möglichkeiten mit
%1
und %~1
hatte aber neee, alles auf %~1
bis dato natürlich noch nicht, heißt also, oben müsste es dann einfach nur echo %%s
sein, leck mich doch fett, ich geh Abend essen. Es macht für mich keinen Sinn.Danke & greetz
André
Hallo chrislm!
Grüße
bastla
Kann man ihn dazu bringen erst ab zeile 2 zu beginnen..?
Kann "man" - soll man auch? Ein = "muster.csv"
Quelle = "P:\bilderarchiv\" '\ am Ende beachten
Ziel = "c:\bilder\" '\ am Ende beachten
Delim = ";"
FeldNr = 60
Set fso = CreateObject("Scripting.FileSystemObject")
Zeilen = Split(fso.OpenTextFile(Ein).ReadAll, vbCrLf)
For i = 1 To UBound(Zeilen)
If Trim(Zeilen(i)) <> "" Then fso.CopyFile Quelle & Replace(Split(Zeilen(i), Delim)(FeldNr - 1), """", ""), Ziel
Next
bastla
Hallo,
da mische ich mich doch auch noch mal ein...
Jetzt ist EOL aber ein Space, es ist dann deaktivert, aber nur weil delims auch noch auf space und TAB steht.
Und die Regel ist wenn das EOL-Zeichen auch ein Delim-Zeichen ist, ist die EOL-Funktion deaktiviert.
Wenn man aber keine Delims haben möchte, braucht man
Dann steht das EOL-Zeichen auf Linefeed, das Zeichen kann aber selbst niemals in einer FOR /F Loop auftauchen.
Gruß
jeb
da mische ich mich doch auch noch mal ein...
Jetzt ist EOL aber ein Space, es ist dann deaktivert, aber nur weil delims auch noch auf space und TAB steht.
Und die Regel ist wenn das EOL-Zeichen auch ein Delim-Zeichen ist, ist die EOL-Funktion deaktiviert.
Wenn man aber keine Delims haben möchte, braucht man
for /f ^"usebackqDelims^=^ eol^=^
delims=^" %%s in ("datei.csv") do ( ....
Dann steht das EOL-Zeichen auf Linefeed, das Zeichen kann aber selbst niemals in einer FOR /F Loop auftauchen.
Gruß
jeb
moin Jeb,
Na dann schau nochmal genau auf die Zeile, der Delimiter wird doch auf nichts gesetzt. Das Nichtmaskierte Leerzeichen Vor der For-Variable %%s ist für die Abgrenzung zu den FOR-Optionen.
also kannst Dein LF Konstrukt gleich mit dem anderen (Kein EOL) ersetzen. (obwohl Deins hat was, ich mache mir mittlerweile auch multiple Batcheszeilen)
Gruß Phil
Zitat von @jeb-the-batcher:
> for /f usebackqDelims^=^ eol^= %%s in ("datei.csv") do ( ....
Jetzt ist EOL aber ein Space, es ist dann deaktivert, aber nur weil delims auch noch auf space und TAB steht.
Und die Regel ist wenn das EOL-Zeichen auch ein Delim-Zeichen ist, ist die EOL-Funktion deaktiviert.
> for /f usebackqDelims^=^ eol^= %%s in ("datei.csv") do ( ....
Jetzt ist EOL aber ein Space, es ist dann deaktivert, aber nur weil delims auch noch auf space und TAB steht.
Und die Regel ist wenn das EOL-Zeichen auch ein Delim-Zeichen ist, ist die EOL-Funktion deaktiviert.
Na dann schau nochmal genau auf die Zeile, der Delimiter wird doch auf nichts gesetzt. Das Nichtmaskierte Leerzeichen Vor der For-Variable %%s ist für die Abgrenzung zu den FOR-Optionen.
@set Prompt=$g
echo on
(
echo(
@echo Die obere Schleife ist nur zum nachvollziehen
echo(
echo 1. Kein EOL:
rem 1.
for /f tokens^=1-2Delims^=^,eol^= %%i in (" . .") do @echo _%%i_%%j_
echo(
echo 2. Wenn Hier EOL ein Leerzeichem waere,
echo wuerde die Ausgabe auch ohne Leerzeichen sein
rem 2.
for /f tokens^=1-2Delims^=^,^ eol^= %%i in (" . .") do @echo _%%i_%%j_
echo(
echo 3. so wie hier
rem 3.
for /f "tokens=1-2eol= Delims=, " %%i in (" . .") do @echo _%%i_%%j_
echo(
pause
)3>&1
also kannst Dein LF Konstrukt gleich mit dem anderen (Kein EOL) ersetzen. (obwohl Deins hat was, ich mache mir mittlerweile auch multiple Batcheszeilen)
"C:\Windows\sleep.exe" 1 2>nul >&2 && set "Warte=2>nul >&2 "C:\Windows\sleep.exe" "^
|| (timeout 2>&1) |find "FEHLER:" >nul && set "Warte=2>nul >&2 Timeout /NOBREAK /T "^
|| (waitfor 2>&1) |find "FEHLER:" >nul && set "Warte=2>nul >&2 Waitfor x /T "^
|| set "Warte=2>nul >&2 ping localhost -n "
set ErrorOut= /c:"Syntaxfehler." ^
/c:"Datei .* nicht gefunden"
Gruß Phil