Datei in jeweils xxx Zeilen splitten?

F

fabian-k

Grünschnabel
Hi Community!

Ich habe eine 500MB-Datei und moechte diese in jeweils ~1000-Zeilen-Dateien aufteilen. Da ich mich allerdings erst seit wenigen Tagen mit Shell-Skripten beschaeftige, habe ich absolut keine Ahnung wie das funktionieren soll :-(

Koennt Ihr mir vielleicht etwas weiterhelfen???

Ich habe bereits mehrfach gegooglet (etc.), aber ich habe immer nur Anleitungen zum Splitten in vorgegebene Dateigroessen gefunden, aber nicht in Zeilenanzahlen.

Hintergrund:
Ich habe, wie erwaehnt, eine ~500MB große Datei. Dabei handelt es sich um eine .csv-Datei. Diese soll in Microsoft Excel (und/oder OpenOffice) importiert werden. Da M$ Excel jedoch nur maximal 65536 Zeilen anzeigen kann, muss ich diese .csv-Datei auf mehrere Dateien aufteilen. (1000 Zeilen sind nur ein Beispiel. Ich wuerde dann jeweils 65000-Zeilen-Dateien erstellen lassen...)

mfg
n00b:fabian
 
Hi,

na was könnte zum Splitten denn naheliegender sein als split? ;-)

Code:
split -l 1000 inputfile outputpart_

Teilt inputfile in 1000er Zeilen und nennt sie outputpart_aa, -ab, -ac, usw.

Gruß Daniel
 
Zuletzt bearbeitet:
Hi,
Code:
split -l 1000 inputfile outputpart_

Teilt inputfile in 1000er Zeilen und nennt sie outputpart_aa, -ab, -ac, usw.

Hatte ich auch schon probiert.
Aber damit erhalte ich ja dann in der Ausgabe keine .csv-Dateien ;-)
(Ich muesste alle nachtraeglich umbenennen.. Bloed :( Vor allem weil es sein kann, dass es im Endeffekt 200-Zeilen-Dateien werden sollen, was bei 200.000 Zeilen [und mehr..] eine ziemlich langandauernde Aufgabe waere...)


Ich habe folgendes versucht:
Code:
OUT=0
DATA=1
while read LINE;
do
	if [ $DATA -ne "65000" ] 
		then
			$LINE > $OUT.txt 
			$DATA=`expr $DATA + 1`
		else
			$OUT=`expr $OUT + 1`
			$DATA=1
	fi
done < input.csv

Fehlermeldung:
split.sh: 13: 1=2: not found
split.sh: 13: "1;4;23;bla;blubb;...": not found

split.sh: 13: 1=2: not found
split.sh: 13: "2;4;23;foo;bar;...": not found

split.sh: 13: 1=2: not found
split.sh: 13: "3;4;23;lorem;ipsum;...": not found

...

Irgendwas laeuft da noch nicht rund ?(
 
Hi,

leider bietet split keine alternativen Suffixe an. Aber das ganze läßt sich ja auch mit Hilfe von find oder ähnlichen Werkzeugen zurechtbiegen:

Code:
find . -name 'outputpart_*' -exec mv "{}" "{}.csv" \;

Gruß Daniel
 
Was ist da das Problem?
Code:
split -l 1000 inputfile outputpart_
for file in outputpart_*; do mv "$file" "${file}.csv"; done

Hi,

leider bietet split keine alternativen Suffixe an. Aber das ganze läßt sich ja auch mit Hilfe von find oder ähnlichen Werkzeugen zurechtbiegen:

Code:
find . -name 'outputpart_*' -exec mv "{}" "{}.csv" \;

Gruß Daniel

Inperformant bei vielen Dateien, nimm xargs!

Ein Bashscript, musst nur irgendwohin kopieren und Variablen füllen im Script.
#!/bin/bash
inputfile="input.csv"
outputfiles="output.csv"
lines=$(wc -l "$inputfile" | cut -d " " -f 1);
nlines=5
count=1

for ((x=1;x<$lines;x=$(($x+$nlines)))); do
sed "${x},$(($x+$nlines))!d" < "$inputfile" > "${outputfiles%%.*}_"$count".${outputfiles##*.}" && ((count++))
done
 
Zuletzt bearbeitet:
Ah, ihr seid die Besten!! ;-)

Vielen Dank, es hat alles funktioniert.
(Habe es aus performancegruenden [Live-Server] mit smg's Vorschlag durchgefuehrt.)

mfg&danke@all
fabian
 
Zurück
Oben