mehrere CSV Dateien in eine Excel Datei zusammenführen

OP #1199107
Lesenswert?

servus,

ich hoffe wirklich ihr könnt mir helfen, ich bin nämlich fast schon am 
verzweifeln. Ich habe des öfteren mehrere csv Dateien und möchte diese 
alle in einer Excel Datei haben. Alle haben die gleiche Formatierung. 
Das heißt alle haben zum Beispiel oben 5 Spalten und darunter mehrere 
Zeilen mit Werten. Ich will eine Datei machen, in der alle Werte 
untereinander stehen, ohne jede Datei öffnen zu müssen und in die eine 
Datei einzufügen. Weiß jemand wie man das machen kann?
OP #1199130
Lesenswert?

Danke, das habe ich auch gewusst :-) Aber damit kann ich nicht viel 
anfangen, wie gesagt ich nuss die Arbeit öfter machen und will nicht 
jedes mal 30 CSV Dateien in Excel öffnen und dann in eine Excel Datei 
ziehen müssen. Das muss doch irgendwie schneller gehen oder? z.B. über 
VBA oder so.
Gast #1199170
Lesenswert?

In Excel ein Arbeitblatt öffnen und dann die CSV-Dateien mit Extra-
externe Dateien-einlesen (oder so ähnlich) eine nach der anderen
einlesen. Datei wird abei ausgewählt, Einfügeposition ist auch
wählbar.

Wenn es immer die gleichen Dateien an den gleichen Position sein
sollen , denn Makro-Rekorder verwenden und das ganze einmal
kpl. aufzeichnen. Danach reicht dann ein Makroaufruf.

Das Makro läßt sich dann auch in VBA abändern.

gruß hans
Gast #1199607
Lesenswert?

copy (DOS-Programm) kann Dateien verbinden.
einfach mal "copy /?" in der DOS-Box eingeben und sich die Hinweise 
durchlesen.
Es müsste mit
copy Datei1+Datei2+Datei3 DateiAlle

gehen (Vermutung meinerseits...)
Gast #1199617
Lesenswert?

>copy /b datei1+datei2 datei1und2
/b wirst du bei csv nicht brauchen - es schadet aber auch nichts.

In einem Batch könnte man das sogar rekursiv machen. So etwa in der Art:
1
echo. > alle.csv
2
for %%a in (*.csv) DO call c:\util\copy2.bat %%a
und in copy2.bat steht:
1
copy alle.csv + %1 >> alle.csv

Vielleicht geht es auch direkt (in meiner etwas anders gestalteten 
Anwendung war die Aufteilung notwendig):
1
echo. > alle.csv
2
for %%a in (*.csv) DO copy alle.csv + %%a >> alle.csv

Zuerst wird eine leere Datei alle.csv erstellt. Dann werden alle im 
Verzeichnis stehenden CSV-Dateien nacheinander an 'alles.csv' angehängt. 
Die Reihenfolge mag aber von der ursprünglichen Windows-Dateisortierung 
abhängen.

-- ich habe dies jetzt nicht ausprobiert! --
Gast #1199624
Lesenswert?

Ergänzung:
ich habe mir irgendwann mal einen Link erstellt mit dem folgenden 
Kommando:

%windir%\hh.exe ms-its:%windir%\Help\ntcmds.chm::/ntcmds.htm

Dahinter verbirgt sich eine ausführliche Hilfe zu den Batchkommandos, 
die vermutlich (hoffentlich!) auf jedem XP-System bereits mitinstalliert 
ist.
OP #1200174
Lesenswert?

Vielen Dank für eure Antworten, ich verstehe nur leider nicht ganz genau 
wie ich das mahcen soll. Ich bin eher ein Laie. Wie funktioniert das 
genau mit dem Batch? Was muss ich machen? Welche Datei erstellen? :

> In einem Batch könnte man das sogar rekursiv machen. So etwa in der Art:
> [pre]
> echo. > alle.csv
> for %%a in (*.csv) DO call c:\util\copy2.bat %%a...............

Könnte mir das jemand bitte nochmal genauer erklären? :-)
Gast #1200791
Lesenswert?

>Könnte mir das jemand bitte nochmal genauer erklären? :-)
Sorry, gestern waren noch einige Fehler drin - die Idee funktioniert 
aber.
Getestet lautet der Batchfile (join_csv.bat) so - und jetzt funktioniert 
das auch :-):
1
echo. > alle.csv
2
for %%a in (*.csv) DO copy /b alle.csv+%%a alle.csv

Zeile 1 löschte eine alte Datei 'alle.csv' indem sie einfach eine neue 
leere erstellt. Dort könntest du auch bereits die Spaltenüberschriften 
schreiben.

Zeile 2 sucht im aktuellen Verzeichnis alle Dateien mit der Endung *.csv 
und kopiert diese hinter 'alle.csv'. Da sich das solange wiederholt, bis 
alle vorhandenen Dateien mit der Endung *csv bearbeitet sind, hast du am 
Ende das Ergebnis in 'alle.csv'.

Ich habe dir mal drei kleine CSV-Dateien angehängt und den Batchfile 
join_csv.bat ebenso. Speichere die Dateien in einem Ordner und starte 
den Batchfile. Danach entsteht 'alle.csv'. Du kannst dir die Dateien in 
einem Texteditor oder direkt in Excel anschauen.
Angehängte Dateien:
Gast #1205209
Lesenswert?

>Genau was ich gesucht habe. Danke
Man tut was man kann :-)

Übrigens, wenn du statt

  echo. > alle.csv

die Zeile

  echo Spalte1;Spalte2;Spalte3;Spalte4 > alle.csv

schreibst, dann wird die erste Zeile zur Spaltenüberschrift.
Gast #1215955
Lesenswert?

Du brauchst dazu kein Linux. Installiere Msys oder UnxUtils, dann hast
o.g. tail und viele andere nützliche Tools zur automatisierten
Verarbeitung von Textdateien (sed, awk, split diff, grep und wie sie
alle heißen) auch unter Windows zur Verfügung. Die genannten Pakete
tragen im Vergleich zu Cygwin überhaupt nicht dick auf und sollten
deswegen eigentlich auf keinem Windows-Rechner fehlen.
Gast #1215983
Lesenswert?

1
for %%a in (*.csv) DO copy /b alle.csv+%%a alle.csv
1
for f in *.csv; do tail -n +1 "$f" >> riesendatei.csv; done

Vorsicht, *.csv beinhaltet auch alle.csv  bzw. riesendatei.csv. Die 
Datei wird also in sich selber kopiert! (Und es ist nicht vorauszusagen 
wie voll sie in dem Moment ist.)

Ich mache so etwas immer so:
1
del alle.csv
2
type *.csv > alle.c
3
ren alle.c alle.csv

Also erst löschen, dann alles in eine .c-Datei kopieren, die dann in 
*.csv umbenannt wird. (Die mittlere Zeile macht das gleiche wie 
"for...copy+".)
Gast #1215988
Lesenswert?

mh wrote:
>
1
for %%a in (*.csv) DO copy /b alle.csv+%%a alle.csv
>
1
for f in *.csv; do tail -n +1 "$f" >> riesendatei.csv; done
>
> Vorsicht, *.csv beinhaltet auch alle.csv  bzw. riesendatei.csv. Die
> Datei wird also in sich selber kopiert! (Und es ist nicht vorauszusagen
> wie voll sie in dem Moment ist.)
Zumindest unter Linux wird der Ausdruck '*.csv' vorher bewertet, was 
'Rekursionen' ausschließt. Dass man 'riesendatei.csv' vorher löschen 
sollte, hab ich mal vorausgesetzt... sonst halt:
1
echo > riesendatei.csv; for f in *.csv; do tail -n +1 "$f" >> riesendatei.csv; done
Gast #1216751
Lesenswert?

@Jason Dom
>Kann man es so erweitern, dass immer ab Zeile 2 der CSV-Dateien gelesen
>wird?
Da wüsste ich jetzt keine Antwort als Batch. Falls ich die Anforderung 
hätte, würde ich ein kleines C-Progrämmchen schreiben, das mir beim 
Lesen der Dateien die erste Zeile entfernt.
Probier es aber mal mit dem 'tail' aus den obigen Vorschlägen.

@mh
>Vorsicht, *.csv beinhaltet auch alle.csv  bzw. riesendatei.csv. Die
>Datei wird also in sich selber kopiert! (Und es ist nicht vorauszusagen
>wie voll sie in dem Moment ist.)
Hatte ich zunächst auch gedacht, aber während des Batchlaufs scheint das 
kein Problem zu sein. Es dürfte sich genauso verhalten, wie es Sven P. 
von Linux her kennt.

>Ich mache so etwas immer so:
> del alle.csv

Klar muss die alte Summendatei zuerst gelöscht werden. Meine erste Zeile 
löscht die alte 'alle.csv' ja auch, indem es eine neue, leere erstellt:
  echo. > alle.csv
als Leerzeile oder mit Inhalt:
  echo Spalte1;Spalte2;Spalte3;Spalte4 > alle.csv

Dein Vorschlag ist ja noch einfacher - allerdings kann bei meinem der 
Befehl 'copy /b alle.csv+%%a alle.csv' durch jeden anderen ersetzt 
werden und so auch andere Aufgaben auf alle Files eine Filegruppe 
angewandt werden. Beispiel:
   for %%a in (*.htm) DO call c:\util\batchprg.bat %%a

führt dann für alle *.HTM-Dateien nacheinander die Aufrufe
   batchprg.bat datei1.htm
   batchprg.bat datei2.htm
usw. aus.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren