CSV Datei neu anordnen, leere Spalten hinzufügen
Mit Batch kenne ich mich einigermaßen aus, ich hoffe ihr könnt mir bei folgender Frage helfen.
Mit einer Batch Datei möchte ich gerne eine CSV Datei überarbeiten.
Bsp. Original-Datei
Spalte 10; Spalte 2; Spalte 3; Spalte 4; Spalte 9; Spalte 5 ...
Nun möchte ich gerne die Spalten entsprechend ordnen, d.h. das die erste Spalte (wo auch immer sie in der CSV Datei steht) in der neuen CSV Datei am Anfang steht.
Zusätzlich muß ich aber bsp. zwischen Spalte 2 und Spalte 3 eine neue leere Spalte einfügen.
Bsp. Neue-Datei
Spalte 1; Spalte 2; Spalte 3 (neue Spalte), Spalte 4 (alt Spalte 3) usw.
Ich hoffe ihr könnt mir helfen.
LG Marja
Mit einer Batch Datei möchte ich gerne eine CSV Datei überarbeiten.
Bsp. Original-Datei
Spalte 10; Spalte 2; Spalte 3; Spalte 4; Spalte 9; Spalte 5 ...
Nun möchte ich gerne die Spalten entsprechend ordnen, d.h. das die erste Spalte (wo auch immer sie in der CSV Datei steht) in der neuen CSV Datei am Anfang steht.
Zusätzlich muß ich aber bsp. zwischen Spalte 2 und Spalte 3 eine neue leere Spalte einfügen.
Bsp. Neue-Datei
Spalte 1; Spalte 2; Spalte 3 (neue Spalte), Spalte 4 (alt Spalte 3) usw.
Ich hoffe ihr könnt mir helfen.
LG Marja
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 166800
Url: https://administrator.de/contentid/166800
Ausgedruckt am: 15.11.2024 um 01:11 Uhr
25 Kommentare
Neuester Kommentar
Hallo Marja!
Grüße
bastla
die erste Spalte (wo auch immer sie in der CSV Datei steht)
... wäre woran zu erkennen, bzw- Nach welchem Kriterium soll sortiert werden?
- Wie viele Spalten gibt es?
- Ist das Leerzeichen am Beginn jeder Spalte Absicht?
- Gibt es einen Einwand gegen die (zumindest temporäre) Verwendung von VBS?
Grüße
bastla
Zitat von @Marja:
Mit einer Batch Datei möchte ich gerne eine CSV Datei überarbeiten.
Bsp. Original-Datei
Spalte 10; Spalte 2; Spalte 3; Spalte 4; Spalte 9; Spalte 5 ...
Mit einer Batch Datei möchte ich gerne eine CSV Datei überarbeiten.
Bsp. Original-Datei
Spalte 10; Spalte 2; Spalte 3; Spalte 4; Spalte 9; Spalte 5 ...
Diese drei Zeilen sollten es tun:
cat exceldatei.csc | gawk -F ";" ' { print $20 " ; " $2 " ; <leerzeichen> ; " $3 " ; "$4 " ; " $9 " ; "$5 " ; " ... } >neue-exceldatei.csv
grep "Spaltenbezeichner" neue-exeldatei.csv >sortierte-neue-exceldatei.csv
grep -v "Spaltenbezeichner" neue-exeldatei.csv | sort >>sortierte-neue-exceldatei.csv
gruß
lks
PS. Die Befehle stehen mit cygwin (http://cygwin.com) ) auch unter Windows zur Verfügung.
Zitat von @Lochkartenstanzer:
> Zitat von @Marja:
> ----
> Mit einer Batch Datei möchte ich gerne eine CSV Datei überarbeiten.
>
> Bsp. Original-Datei
> Spalte 10; Spalte 2; Spalte 3; Spalte 4; Spalte 9; Spalte 5 ...
>
Diese drei Zeilen sollten es tun:
cat exceldatei.csc | gawk -F ";" ' { print $20 " ; " $2 " ; <leerzeichen> ; " $3
" ; "$4 " ; " $9 " ; "$5 " ; " ... } >neue-exceldatei.csv
grep "Spaltenbezeichner" neue-exeldatei.csv >sortierte-neue-exceldatei.csv
> Zitat von @Marja:
> ----
> Mit einer Batch Datei möchte ich gerne eine CSV Datei überarbeiten.
>
> Bsp. Original-Datei
> Spalte 10; Spalte 2; Spalte 3; Spalte 4; Spalte 9; Spalte 5 ...
>
Diese drei Zeilen sollten es tun:
cat exceldatei.csc | gawk -F ";" ' { print $20 " ; " $2 " ; <leerzeichen> ; " $3
" ; "$4 " ; " $9 " ; "$5 " ; " ... } >neue-exceldatei.csv
grep "Spaltenbezeichner" neue-exeldatei.csv >sortierte-neue-exceldatei.csv
Hier noch ein
sed -e "s/Kundenummer; ;ArtikelNr/Kundenummer;KontaktNr;ArtikelNr/g" -i sortierte-neue-exceldatei.csv
eingefügt und schon hast Du die Header auch angepaßt.
grep -v "Spaltenbezeichner" neue-exeldatei.csv | sort >>sortierte-neue-exceldatei.csv
gruß
lks
PS. Die Befehle stehen mit cygwin (http://cygwin.com) ) auch unter Windows zur Verfügung.
gruß
lks
PS. Die Befehle stehen mit cygwin (http://cygwin.com) ) auch unter Windows zur Verfügung.
Hallo Marja!
Ich würde, wie schon erwähnt, VBS verwenden:
Zu beachten: Die Feldnummern beginnen bei 0 ...
Grüße
bastla
Ich würde, wie schon erwähnt, VBS verwenden:
Alt = "D:\Die.csv"
Neu = "D:\Die neue.csv"
Delim = ";"
Set fso = CreateObject("Scripting.FileSystemObject")
Zeilen = Split(fso.OpenTextFile(Alt).ReadAll, vbCrLf)
Set DateiNeu = fso.CreateTextFile(Neu)
For Each Zeile In Zeilen
If Trim(Zeile) = "" Then 'Leerzeile oder nur Leerzeichen enthalten
ZeileNeu = Zeile
Else
Felder = Split(Zeile, Delim) 'anhand des Trennzeichens <Delim> in Felder zerlegen
ZeileNeu = _
Felder(5) & Delim & _
Felder(0) & Delim & _
Felder(3) & Delim & _
Delim & _
Felder(4) & Delim & _
Felder(2) & Delim & _
Delim & _
Felder(6)
End If
DateiNeu.WriteLine ZeileNeu
Next
Grüße
bastla
Hallo Marja,
hier mal ein Vorschlag als Batchscript:
Einschränkung:
In der Quelldatei dürfen höchstens 31 Spalten vorkommen.
Erklärung:
In Zeile 16 wird das Spaltenlayout festgelegt. Das Beispiel bedeutet:
In Zeile 17 werden die Nummern der Spalten festgelegt , vor denen eine neue Spalte eingefügt werden soll. Die Zählung bezieht sich auf die Spaltennummern in der Zieldatei, ohne die neu hinzugefügten Spalten mitzuzählen . Die Nummern müssen in aufsteigender Reihenfolge angegeben werden.
In Zeile 18 werden die Header der neuen Spalten festgelegt. Die Reihenfolge muss mit der der Nummern der neuen Spalten aus Zeile 17 korrespondieren.
Bei weiteren Fragen zur Funktionsweise, lass hören.
Gruß
Friemler
hier mal ein Vorschlag als Batchscript:
@echo off
setlocal
set "InputFile=Test.csv"
set "OutputFile=Out.csv"
::Altes Spaltenlayout
::Datum;IMEI;Hersteller;Kundenummer;ArtikelNr;Id;Fehler
::Neues Spaltenlayout
::Id;Datum;Kundenummer;KontaktNr;ArtikelNr;Hersteller;IMEI;Ansprechpartner;Fehler
set "ColLayout=6 1 4 5 3 2 7"
set "NewColumns=4 7"
set "NewColumnsHeader=Kontaktnummer Ansprechpartner"
type NUL > "%OutputFile%"
set /a MaxCol=0
for %%i in (%ColLayout%) do (
call :GetMaxCol %%i
)
set /a RowCount=1
for /f "usebackq eol= delims=" %%l in ("%InputFile%") do (
set "Line=%%l"
call :ProcessLine
)
exit /b
:ProcessLine
set /a ColCount=0
for %%i in (%ColLayout%) do (
set /a ColCount+=1
call :WriteNewColumn
call :WriteColumn %%i
)
>>"%OutputFile%" echo.
set /a RowCount+=1
exit /b
:WriteNewColumn
set /a Idx=1
for %%j in (%NewColumns%) do (
if "%%j" equ "%ColCount%" (
if %RowCount% equ 1 (
call :WriteNewColumnHeader
) else (
>>"%OutputFile%" <NUL set /p "=;"
)
)
set /a Idx+=1
)
exit /b
:WriteNewColumnHeader
for /f "tokens=%Idx%" %%k in ("%NewColumnsHeader%") do (
>>"%OutputFile%" <NUL set /p "=%%k;"
)
exit /b
:WriteColumn
for /f "tokens=%1 eol= delims=;" %%c in ("%Line%") do (
if %ColCount% lss %MaxCol% (
>>"%OutputFile%" <NUL set /p "=%%c;"
) else (
>>"%OutputFile%" <NUL set /p "=%%c"
)
)
exit /b
:GetMaxCol
if %1 gtr %MaxCol% set /a MaxCol=%1
exit /b
Einschränkung:
In der Quelldatei dürfen höchstens 31 Spalten vorkommen.
Erklärung:
In Zeile 16 wird das Spaltenlayout festgelegt. Das Beispiel bedeutet:
- Die erste Spalte der Quelldatei ist auch die erste Spalte in der Zieldatei (1 steht auf dem ersten Platz der Liste)
- Die vierte Spalte der Quelldatei wird zur zweiten Spalte der Zieldatei (4 steht auf dem zweiten Platz der Liste)
- Die zweite Spalte der Quelldatei wird zur dritten Spalte der Zieldatei (2 steht auf dem dritten Platz der Liste)
- usw.
In Zeile 17 werden die Nummern der Spalten festgelegt , vor denen eine neue Spalte eingefügt werden soll. Die Zählung bezieht sich auf die Spaltennummern in der Zieldatei, ohne die neu hinzugefügten Spalten mitzuzählen . Die Nummern müssen in aufsteigender Reihenfolge angegeben werden.
In Zeile 18 werden die Header der neuen Spalten festgelegt. Die Reihenfolge muss mit der der Nummern der neuen Spalten aus Zeile 17 korrespondieren.
Bei weiteren Fragen zur Funktionsweise, lass hören.
Gruß
Friemler
Hier die Erläuterungen dazu
cat gibt die exceldatei aus und diese wird durch den Befehl gawk verarbeitet, in dem einzelne Elemente in anderer Reihenfolge ausgegeben werden. Das Ergebnis wird in die neue-exceldatei.csv geschrieben.
Damit schreibe ich die Spaltenüberschriften als erste zeile in die sortierte-neue-exceldatei.csv
Hier wird in der Spaltenüberschrift noch die Kontaktnummer hineingeschrieben.
grep verabeitet die neue-Exceldatei und verwirft die Zeile mit den Spaltenbezeichnern (wurde ja schon geschrieben) und das wird durch sort durchsortiert. ggf. muß man hier durch parameter noch angeben, nach welchem Feld sortiert werden soll. Das Ergebnis landet dann in sortierte-neue-exceldatei.csv hinter den SPaltenbezeichnern.
Die Befehle cat, gawk, sed, grep und sort sind Standardbefehle unter unixoiden Systemen und stehen mit http://www.cygwin.com auch unter windows zur Verfügung.
cat exceldatei.csc | gawk -F ";" ' { print $20 " ; " $2 " ; <leerzeichen> ; " $3 " ; "$4 " ; " $9 " ; "$5 " ; " ... } >neue-exceldatei.csv
cat gibt die exceldatei aus und diese wird durch den Befehl gawk verarbeitet, in dem einzelne Elemente in anderer Reihenfolge ausgegeben werden. Das Ergebnis wird in die neue-exceldatei.csv geschrieben.
grep "Spaltenbezeichner" neue-exeldatei.csv >sortierte-neue-exceldatei.csv
Damit schreibe ich die Spaltenüberschriften als erste zeile in die sortierte-neue-exceldatei.csv
sed -e "s/Kundenummer; ;ArtikelNr/Kundenummer;KontaktNr;ArtikelNr/g" -i sortierte-neue-exceldatei.csv
Hier wird in der Spaltenüberschrift noch die Kontaktnummer hineingeschrieben.
grep -v "Spaltenbezeichner" neue-exeldatei.csv | sort >>sortierte-neue-exceldatei.csv
grep verabeitet die neue-Exceldatei und verwirft die Zeile mit den Spaltenbezeichnern (wurde ja schon geschrieben) und das wird durch sort durchsortiert. ggf. muß man hier durch parameter noch angeben, nach welchem Feld sortiert werden soll. Das Ergebnis landet dann in sortierte-neue-exceldatei.csv hinter den SPaltenbezeichnern.
Die Befehle cat, gawk, sed, grep und sort sind Standardbefehle unter unixoiden Systemen und stehen mit http://www.cygwin.com auch unter windows zur Verfügung.
Hallo Marja,
das hört man aber garnicht gerne .
Ausserdem: Oben stehen zwei Lösungen (VBS und Batch), das sind Windows-Bordmittel.
Gruß
Friemler
das hört man aber garnicht gerne .
Ausserdem: Oben stehen zwei Lösungen (VBS und Batch), das sind Windows-Bordmittel.
Gruß
Friemler
Doch! s.o. Sieht halt nur nicht ganz so elegant aus.
Hintergrund: Ich darf hier leider nichts auf dem Firmen PC installieren, die Batch Datei wird später an verschiedenen Clients
eingesetzt und da ist installieren definitiv nicht möglich/erlaubt.
Da ist die Frage, ob für solch einen Einsatzzweck die Admins keine Ausnahme machen. Einfach mal fragen. Die entsprechenden Tools kamm nan übrigens auch ohne explizite Installation des Gesamtpakets verwenden. Man muß sich dann halt nur die einzelnen Befehle und die cygwin..dll heraussuchen und in ein User-Verzeichnis packen.
Hmmm, ich schau mir aber mal den Link an.
Danke für eure Hilfe.
LG Marja
gern geschehen.
lks
Moin Lochkartenstanzer,
Aber: Wenn bei mir jemand anklopfen würde, der cygwin installieren wollte, weil eine Import/Export-CSV-Datei umsortiert werden muss, weil irgendwer es nicht auf die Reihe bekommen hat, nun gleich alle vielen beiden zwei Seiten einer Schnittstelle zeitgleich aktiv zu setzen...
Hey - es gibt in diesem Szenario nur zwei mögliche Varianten.
Entweder die Jungs & Mädels bringen glaubhaft dar, dass dieses Zwangs-Kompatibel-Pressen halt wegen diesen und jenen Softwareproblemen befristet für ein oder zwei Wochen sein muss.
Dann-> Hey, für eine befristete Übergangsfrickelei gibt es keine Ausnahmeinstallation, wenn es auch mit Bordmitteln geht.
Was soll die Ästhetik und Eleganz, wenn dieser Bypass ohnehin in zwei Wochen Asche ist.
-oder-
Die Jungs & Mädels sagen, die wollen dieses Gewurschtel dauerhaft als Teil einer produktiven Prozesskette betreiben.
Dann -> will ich eine Kopie der "produktiv eingesetzten" Skriptversion mit Beschreibung, Tel-Nummer der Autors und das ganze Skript dokumentiert. Auch wenn es bedeutet, dass für eine sed-Halbzeile eine DIN-A4-Seite Doku getippt wird.
Und das Skriptchen wird, wenn irgendwie möglich, event- oder zeitgesteuert gestartet und ist ohne Adminrechte bestenfalls lesbar etc pp.
Denn wenn es als Teil der betrieblichen Prozesse unabdingbar ist, dann gelten auch die Regeln für produktiv eingesetzte Programme.
In diesem Fall würde ich cygwin oder was-auch-immer installieren.
Frage ist nur, ob denn irgendein Hierarch tatsächlich diese Bankrotterklärung ("Wir bekommen die Schnittstelle zur Lohnbuchhaltung nur mit Gefrickel hin") unterschreiben wird.
Das darf doch bei Export/Importschnittstellen wohl nicht wahr sein, dass die Änderung der Spaltenanzahl- oder Reihenfolge im erzeugenden oder lesenden Programm so furchtbar zeitaufwändig ist.
Grüße
Biber
Zitat von @Lochkartenstanzer:
Da ist die Frage, ob für solch einen Einsatzzweck die Admins keine Ausnahme machen. Einfach mal fragen.
Ich kann da ja nicht für andere Admins sprechen.Da ist die Frage, ob für solch einen Einsatzzweck die Admins keine Ausnahme machen. Einfach mal fragen.
Aber: Wenn bei mir jemand anklopfen würde, der cygwin installieren wollte, weil eine Import/Export-CSV-Datei umsortiert werden muss, weil irgendwer es nicht auf die Reihe bekommen hat, nun gleich alle vielen beiden zwei Seiten einer Schnittstelle zeitgleich aktiv zu setzen...
Hey - es gibt in diesem Szenario nur zwei mögliche Varianten.
Entweder die Jungs & Mädels bringen glaubhaft dar, dass dieses Zwangs-Kompatibel-Pressen halt wegen diesen und jenen Softwareproblemen befristet für ein oder zwei Wochen sein muss.
Dann-> Hey, für eine befristete Übergangsfrickelei gibt es keine Ausnahmeinstallation, wenn es auch mit Bordmitteln geht.
Was soll die Ästhetik und Eleganz, wenn dieser Bypass ohnehin in zwei Wochen Asche ist.
-oder-
Die Jungs & Mädels sagen, die wollen dieses Gewurschtel dauerhaft als Teil einer produktiven Prozesskette betreiben.
Dann -> will ich eine Kopie der "produktiv eingesetzten" Skriptversion mit Beschreibung, Tel-Nummer der Autors und das ganze Skript dokumentiert. Auch wenn es bedeutet, dass für eine sed-Halbzeile eine DIN-A4-Seite Doku getippt wird.
Und das Skriptchen wird, wenn irgendwie möglich, event- oder zeitgesteuert gestartet und ist ohne Adminrechte bestenfalls lesbar etc pp.
Denn wenn es als Teil der betrieblichen Prozesse unabdingbar ist, dann gelten auch die Regeln für produktiv eingesetzte Programme.
In diesem Fall würde ich cygwin oder was-auch-immer installieren.
Frage ist nur, ob denn irgendein Hierarch tatsächlich diese Bankrotterklärung ("Wir bekommen die Schnittstelle zur Lohnbuchhaltung nur mit Gefrickel hin") unterschreiben wird.
Das darf doch bei Export/Importschnittstellen wohl nicht wahr sein, dass die Änderung der Spaltenanzahl- oder Reihenfolge im erzeugenden oder lesenden Programm so furchtbar zeitaufwändig ist.
Grüße
Biber
Zitat von @Biber:
Moin Lochkartenstanzer,
> Zitat von @Lochkartenstanzer:
> ----
> Da ist die Frage, ob für solch einen Einsatzzweck die Admins keine Ausnahme machen. Einfach mal fragen.
Ich kann da ja nicht für andere Admins sprechen.
Moin Lochkartenstanzer,
> Zitat von @Lochkartenstanzer:
> ----
> Da ist die Frage, ob für solch einen Einsatzzweck die Admins keine Ausnahme machen. Einfach mal fragen.
Ich kann da ja nicht für andere Admins sprechen.
Vielleicht sorgt ja die Frage bei den Admins dafür, daß die Schnittstelle klargezogen wird.
Sofern diese Konvertierung duaerhaft beötigt wird, wäre meine Vorgehensweise, den Zuständigen für die beiden System auf die Füße zu treten, daß die ein kompatibles Austauschformat festlegen.
Ist es nur kurtfristig, würde ich mir eine Station als Konverter ausgucken, auf der zwei Freigaben einrichten (z.B. In und Out) und per skript alles was in "in" bgelegt wird konvertiert auf "out" ablegen. Sofern dann die System Dateien speichern /einlesen die Daten austauschen, wäre damit das Problem gelöst. (vermutlich ist es dann ein Provisorium für die Ewigkeit.)
Daß auch für Einzeiler eine Dokumentation dazugehört ist natürlich selbtverstädnlich.
lks
Hallo Marja!
Der Vollständigkeit halber die passende VBS-Variante (ungetestet):
Da Du ja ohnehin "Hand anlegen" musst, kannst Du die Headerzeile auch gleich komplett selbst erstellen und dann beim Auslesen die Zeile 1 der CSV-Datei überspringen ...
Grüße
bastla
Der Vollständigkeit halber die passende VBS-Variante (ungetestet):
Alt = "D:\Die.csv"
Neu = "D:\Die neue.csv"
Delim = ";"
'Falls der Header aus der Datei übernommen werden soll, als nächste Zeile: Header = ""
Header = "ID;Datum;Kundenummer;KontaktNr;ArtikelNr;Hersteller;Ansprechpartner;Fehler"
Set fso = CreateObject("Scripting.FileSystemObject")
Zeilen = Split(fso.OpenTextFile(Alt).ReadAll, vbCrLf)
Set DateiNeu = fso.CreateTextFile(Neu)
If Header <> "" Then
DateiNeu.WriteLine Header
Ab = 1
End If
For i = Ab To UBound(Zeilen)
If Trim(Zeilen(i)) = "" Then 'Leerzeile oder nur Leerzeichen enthalten
ZeileNeu = Zeilen(i)
Else
Felder = Split(Zeilen(i), Delim) 'anhand des Trennzeichens <Delim> in Felder zerlegen
ZeileNeu = _
Felder(5) & Delim & _
Felder(0) & Delim & _
Felder(3) & Delim & _
Delim & _
Felder(4) & Delim & _
Felder(2) & Delim & _
Delim & _
Felder(6)
End If
DateiNeu.WriteLine ZeileNeu
Next
Grüße
bastla
Hallo Marja!
Ist wirklich unübersichtlich hier ...
Der geänderte Ansatz steht schon da unten.
Grüße
bastla
Ist wirklich unübersichtlich hier ...
Der geänderte Ansatz steht schon da unten.
Grüße
bastla
Hallo Marja!
Grüße
bastla
hatte irgendwo einen Fehler drin, den ich aber gefunden habe.
Kann bei ungetesteten Scripts leider passieren - ich würde ihn gerne oben im Code noch korrigieren ...Die zweite Meldung ist, das Excel festgestellt hat, das die Datei eine SYLK-Datei ist, aber es kann die Datei nicht laden.
http://support.microsoft.com/kb/215591/deGrüße
bastla
Hallo Marja,
ich schätze mal, das würde mit meinem Batchscript auch so sein, bei mir funktioniert es nämlich.
Ich habe übrigens noch die Ergänzung der Headerzeile eingebaut.
Gruß
Friemler
ich schätze mal, das würde mit meinem Batchscript auch so sein, bei mir funktioniert es nämlich.
Ich habe übrigens noch die Ergänzung der Headerzeile eingebaut.
Gruß
Friemler
[OT] @bastla
Moin bastla,
Ich habe michbeinahe eingenässt zunehmend amüsiert beim Lesen.
"Auf ProgrammierpraktikantInnen ist Verlass" dachte ich an dieser Stelle:
Und bei der 5-Punkte-Anleitung "Wie gebe ich einen Apostroph ein?", da dachte ich nur: "Das sichere ich mir als PDF-Datei."
Grüße
Biber
[/OT]
Moin bastla,
Zitat von @bastla:
> Die zweite Meldung ist, das Excel festgestellt hat, das die Datei eine SYLK-Datei ist, aber es kann die Datei nicht laden.
http://support.microsoft.com/kb/215591/de
Vielen, vielen Dank für diesen Link.> Die zweite Meldung ist, das Excel festgestellt hat, das die Datei eine SYLK-Datei ist, aber es kann die Datei nicht laden.
http://support.microsoft.com/kb/215591/de
Ich habe mich
"Auf ProgrammierpraktikantInnen ist Verlass" dachte ich an dieser Stelle:
Das Problem tritt auf, wenn Sie eine Textdatei öffnen und die ersten beiden Zeichen der Datei die Großbuchstaben ID sind
Auf so blöde Ideen kommt wirklich nicht jeder Coder.Und bei der 5-Punkte-Anleitung "Wie gebe ich einen Apostroph ein?", da dachte ich nur: "Das sichere ich mir als PDF-Datei."
Grüße
Biber
[/OT]