Auslesen bestimmter Spalten aus csv
Hallo,
Ich bekomme regelmäßig csv-Dateien mit ca. 77 Spalten und prinzipiell unbegrenzten Zeilen.
Diese muss ich eindampfen auf 5 Spalten, welche in eine andere Software eingelesen werden.
Nun Versuche ich seit einigen Tagen ein kleines batch zu erstellen welche diesen Vorgang ausführt.
Leider stoße ich dabei mal wieder an meine Grenzen
Ab Spalte 31 gibt er die Daten leider nicht mehr aus.
Die Ausgangs-csv sieht wie folgt aus (mit wesentlich mehr Zeilen):
"KndName";"Zusatz";"Anschrift1";"Anschrift2";"Kundennr";"KndFibunr";"Stammkunde";"KndLastsch";"KndSkonto";"KndZweck1";"KndGruppe";"KndKtoRang";"Bankname";"Bankort";"lfdNr";"AuftraggID";"ABlz";"AKontonr";"EKndID";"KndBLZ";"Zweck2";"KndKontonr";"Betrag";"Faellig";"Beginn";"Ende";"Turnus";"Auftragsgr";"Textschl";"TextJahr";"Brutto";"SkontoPro";"SkontoAbs";"Zweck1";"Zweck2";"Zweck3";"Zweck4";"Zweck5";"Zweck6";"Zweck7";"Zweck8";"Zweck9";"Zweck10";"Zweck11";"Zweck12";"Zweck13";"Zweck14";"AbsName";"EmpfName";"Belegnr";"Kategorie";"UKategorie";"AFibunr";"MwstPro";"MwstAbs";"Netto";"KndKtoBez";"WKZ";"KndZweck2";"bankvwltet";"EIBAN";"ESwift";"AIBAN";"ASwift";"Ref_Auftr";"Ref_Mandat";"Dat_Mandat";"LS_Art";"VerwSchl";"Bez_Mandat";"Rng_Mandat";"Seq_Mandat";"Typ_Mandat";"ZahlgsZiel";"GlaeubigID";"KndReferen";"Schl_Manda";"Nutz_Manda"
"Musterhaus GmbH";"xxx";"xxx";"xxx";"xxx";"xxx";"T";"T";0;"xxx";0;0;"Commerzbank Frankfurt";"Frankfurt";13431;"EBL-Ertr?g";51550000;4540000666;"Musterhaus GmbH";51040038;"St.: 6,65 (19%) netto: 35,0";520429200;41,65;01.03.17;01.03.17;"xxx";"01 (j";0;18;"xxx";41,65;0;0;"Lizenzgebuehr Software Mw";"St.: 6,65 (19%) netto: 35,0";"0 Steuer-Nr. 061 23255003";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";0;0;41,65;"xxx";"EUR";"xxx";"F";"DE63510400380236476800";"COBADEFFXXX";"DE235109000018999999";"WIBADE5WXXX";"xxx";"ABC000003";31.03.14;2;"xxx";"xxx";0;0;0;0;"DE77EBL00000003999";"xxx";"xxx";01.03.16
Das ist mein bisheriger Ansatz - welcher wie gesagt bis Spalte 31 funktioniert.
Wäre toll wenn mir jemand nen Tipp geben könnte wo ich hier ansetzen muss um den Fehler auszumerzen.
Vielen Dank schon mal an jeden der sich mit meinem Problem befasst.
Ich bekomme regelmäßig csv-Dateien mit ca. 77 Spalten und prinzipiell unbegrenzten Zeilen.
Diese muss ich eindampfen auf 5 Spalten, welche in eine andere Software eingelesen werden.
Nun Versuche ich seit einigen Tagen ein kleines batch zu erstellen welche diesen Vorgang ausführt.
Leider stoße ich dabei mal wieder an meine Grenzen
Ab Spalte 31 gibt er die Daten leider nicht mehr aus.
Die Ausgangs-csv sieht wie folgt aus (mit wesentlich mehr Zeilen):
"KndName";"Zusatz";"Anschrift1";"Anschrift2";"Kundennr";"KndFibunr";"Stammkunde";"KndLastsch";"KndSkonto";"KndZweck1";"KndGruppe";"KndKtoRang";"Bankname";"Bankort";"lfdNr";"AuftraggID";"ABlz";"AKontonr";"EKndID";"KndBLZ";"Zweck2";"KndKontonr";"Betrag";"Faellig";"Beginn";"Ende";"Turnus";"Auftragsgr";"Textschl";"TextJahr";"Brutto";"SkontoPro";"SkontoAbs";"Zweck1";"Zweck2";"Zweck3";"Zweck4";"Zweck5";"Zweck6";"Zweck7";"Zweck8";"Zweck9";"Zweck10";"Zweck11";"Zweck12";"Zweck13";"Zweck14";"AbsName";"EmpfName";"Belegnr";"Kategorie";"UKategorie";"AFibunr";"MwstPro";"MwstAbs";"Netto";"KndKtoBez";"WKZ";"KndZweck2";"bankvwltet";"EIBAN";"ESwift";"AIBAN";"ASwift";"Ref_Auftr";"Ref_Mandat";"Dat_Mandat";"LS_Art";"VerwSchl";"Bez_Mandat";"Rng_Mandat";"Seq_Mandat";"Typ_Mandat";"ZahlgsZiel";"GlaeubigID";"KndReferen";"Schl_Manda";"Nutz_Manda"
"Musterhaus GmbH";"xxx";"xxx";"xxx";"xxx";"xxx";"T";"T";0;"xxx";0;0;"Commerzbank Frankfurt";"Frankfurt";13431;"EBL-Ertr?g";51550000;4540000666;"Musterhaus GmbH";51040038;"St.: 6,65 (19%) netto: 35,0";520429200;41,65;01.03.17;01.03.17;"xxx";"01 (j";0;18;"xxx";41,65;0;0;"Lizenzgebuehr Software Mw";"St.: 6,65 (19%) netto: 35,0";"0 Steuer-Nr. 061 23255003";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";"xxx";0;0;41,65;"xxx";"EUR";"xxx";"F";"DE63510400380236476800";"COBADEFFXXX";"DE235109000018999999";"WIBADE5WXXX";"xxx";"ABC000003";31.03.14;2;"xxx";"xxx";0;0;0;0;"DE77EBL00000003999";"xxx";"xxx";01.03.16
Das ist mein bisheriger Ansatz - welcher wie gesagt bis Spalte 31 funktioniert.
for /f "tokens=1,13,21,31 delims=;" %%a in (...ORIGINAL.csv) do echo %%a;%%b;%%c;%%d>>AUSGABE_5_Spalten.csv
Wäre toll wenn mir jemand nen Tipp geben könnte wo ich hier ansetzen muss um den Fehler auszumerzen.
Vielen Dank schon mal an jeden der sich mit meinem Problem befasst.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 308960
Url: https://administrator.de/forum/auslesen-bestimmter-spalten-aus-csv-308960.html
Ausgedruckt am: 23.04.2025 um 15:04 Uhr
6 Kommentare
Neuester Kommentar
Zitat von @Berti82:
Wäre toll wenn mir jemand nen Tipp geben könnte wo ich hier ansetzen muss um den Fehler auszumerzen.
for /f "tokens=1,13,21,31 delims=;" %%a in (...ORIGINAL.csv) do echo %%a;%%b;%%c;%%d>>AUSGABE_5_Spalten.csv
Wäre toll wenn mir jemand nen Tipp geben könnte wo ich hier ansetzen muss um den Fehler auszumerzen.
Falls es Dir nichts ausmacht cygwin oder eine andere bash zu benutzen:
cat Original.CSV | gawk -F ";" ' { print $1 ";" $13 ";" $21 ";" $31 } ' >neu.csv
lks
Nachtrag: Sehe gerade, daß Deine Eingabezeilen der Tabelle sich über mehrere Zeilen der CSV erstrecken. Da muß dann ein wenig mehr Logik reingesteckt werden, damit man zusammengehörige Zeilen erkennt.
Moin Berti82,
nur wenn dir gar keine der anderen Lösungen gefällt und/oder du auf CMD/Batch angewiesen bist...
-> dann musst du aufgrund der Beschränkung auf 31 Tokens mehrere FOR /F-Anweisungen hintereinanderschalten.
Beispiel:
<code type="plain>
K:\>for /f "delims=; tokens=1,13,21,30,*" %a in (77spalten.csv) do @for /f "delims=; tokens=12,30" %A in ("%e") do @echo %a;%b;%c;%A;%B
"KndName";"Bankname";"Zweck2";"Zweck9";"bankvwltet"
"Musterhaus GmbH";"Commerzbank Frankfurt";"St.: 6,65 (19%) netto: 35,0";"xxx";"F"
Dieses Beispiel würde aus deiner *.csv-Datei (bei mir heisst sie
Dazu sind zwei FOR/F-Anweisungen nötig, eine mit der Laufvariablen %a(...bis%e) und eine mit %A (bis %B).
Diese Mimik wäre aber auch nicht meine erste Wahl für deine Anforderung, ich würde eher Kraemers Variante wählen.
Grüße
Biber
nur wenn dir gar keine der anderen Lösungen gefällt und/oder du auf CMD/Batch angewiesen bist...
-> dann musst du aufgrund der Beschränkung auf 31 Tokens mehrere FOR /F-Anweisungen hintereinanderschalten.
Beispiel:
<code type="plain>
K:\>for /f "delims=; tokens=1,13,21,30,*" %a in (77spalten.csv) do @for /f "delims=; tokens=12,30" %A in ("%e") do @echo %a;%b;%c;%A;%B
"KndName";"Bankname";"Zweck2";"Zweck9";"bankvwltet"
"Musterhaus GmbH";"Commerzbank Frankfurt";"St.: 6,65 (19%) netto: 35,0";"xxx";"F"
Dieses Beispiel würde aus deiner *.csv-Datei (bei mir heisst sie
77splaten.csv
die Spalten "KndName";"Bankname";"Zweck2";"Zweck9";"bankvwltet"
rausfieseln.Dazu sind zwei FOR/F-Anweisungen nötig, eine mit der Laufvariablen %a(...bis%e) und eine mit %A (bis %B).
Diese Mimik wäre aber auch nicht meine erste Wahl für deine Anforderung, ich würde eher Kraemers Variante wählen.
Grüße
Biber