CSV-Datei sauber aufteilen ?
lima-city → Forum → Heim-PC → Software
anzahl
array
bedingung
beispiel
byte
code
datei
dateiname
einlesen
einzelne datei
erstellung
gesamt datei
gesamt zeilen
jemand
nummer
schalter
schliessen
trennen
zeile
zeilenweise auslesen
-
Hallo
ich habe eine 50 MB grosse CSV-Datei (mit ca. 60.000 Einträgen=Zeilen)
diese würde ich gerne in mehrere Dateien aufteilen,
so dass jede einzelne Datei max. 2 MB hat (so ca.)
dafür habe ich auch schon Tools gefunden,
aber die machen was falsch, die trennen nach "bytes"
ich will beim "Trennen" nicht irgendwo mitten in der Zeile (wenn die Byte erreicht sind)
sondern nur nach / beim Zeilenumbruch ... so dass keine Zeile "zerissen" wird.
gibt es vielleicht ein Tool, welches nicht mit Byte, sondern mit "Zeilen" arbeitet?
Danke!
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hi,
Du könntest sie mit PHP einlesen und dann nach X Zeilen in weitere Dateien schreiben.
Hier ein Beispiel
<?php /* datei öffnen */ $dateiname = "deine_CSV_datei..."; $lines = 1000; /* Anzahl der Zeilen */ $datei = $zeile = 0; $fp = @fopen($dateiname, "w+") or die ("Kann Datei nicht lesen."); /* datei zeilenweise auslesen */ while($line = fgets($fp, 1024)){ $zeile++; if($zeile == $lines){ $datei++; fwrite("CSV_datei_".$datei.".txt",$line); } } /* datei schliessen */ fclose($fp); ?>
Ich habs nicht getestet, aber sollte möglich sein,
Das Prog speichert dir aktuell immer 1000 Zeilen in eine
TXT-Datei.
Grüsse
Color
Beitrag zuletzt geändert: 13.8.2010 8:00:37 von color -
Hallo erstmal,
ich habe es noch nicht getestet, aber das ist doch genau das, was ich gerade suche...
warum habe ich nur vorher noch nix von lima-city gewußt.
herzlichen Dank
schimmi
-
sorry für die sehr späte Antwort
nicht ganz ... habe es etwas umgewandelt damit es funktioniert
vorallem muss das Schreiben der Zeile ausserhalb der if-Bedingung, denn
die funktioniert ja "nur" als Schalter, um alle 1000 Zeilen eine neue Datei anzufangen
und die neue Datei Nr. 1 muss sogar ausserhalb der while Schleife schon festgelegt werden
$fp ist zum Lesen (r) der Quelldatei und fpx[] als array zur Erstellung (w+) der neuen Dateien
vielleicht können ja auch andere was damit anfangen
hier mein code
<?php $dateiname = "die grosse CSV Datei ..."; $lines = 1000; /* Anzahl der Zeilen */ $datei = 1; /* Datei Nummer */ $zeile = 0; /* Zeilen Zähler bis $lines erreicht ist */ $allez = 0; /* Gesamt Zeilen Zähler */ $fpx = array(); /* handler um neue Dateien zu erstellen */ $godatei = "CSV_datei_".$datei.".txt"; /* neue $godatei Nr. 1 */ echo "<br />neue Datei: ".$godatei."\r\n"; /* read datei öffnen */ $fp = @fopen($dateiname, "r") or die ("Kann Datei nicht lesen."); $fpx[$datei] = @fopen($godatei, "w+") or die ("Kann Datei nicht schreiben."); /* datei zeilenweise auslesen */ while($line = fgets($fp, 1024)){ $zeile++; if($zeile == $lines){ fclose($fpx[$datei]); /* die alte $godatei datei schliessen */ $datei++; $godatei = "CSV_datei_".$datei.".txt"; echo "<br />neue Datei: ".$godatei."\r\n"; /* neue $godatei mit fortlaufender Nr. */ $fpx[$datei] = @fopen($godatei, "w+") or die ("Kann Datei nicht schreiben."); $zeile = 0; /* Zeilen Zähler zurücksetzen */ } fwrite($fpx[$datei],$line); /* in neue datei schreiben */ $allez++; } /* read datei schliessen */ fclose($fp); echo "<br />\r\n"; echo "<br />Zeilen Gesamt: ".$allez."\r\n"; echo "<br />Dateien Gesamt: ".$datei."\r\n"; ?>
ach ja, das array für $fpx ist vielleicht garnicht notwendig
bei $godatei ist ja auch kein Array, sondern wird direkt überschrieben
also geht wohl beides, fragt sich was performanter ist ... naja
ich weiss, nicht grad konsequent, aber funzt ... schön machen geht immernoch
oder hat jemand noch ne bessere Lösung, um sehr Große CSV Dateien zu splitten?
?
Beitrag zuletzt geändert: 28.8.2011 11:16:09 von supershops -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage