Hallo
ich will mir gerade eine Funktion schreiben, die eine CSV-Datei von Duplikaten befreit.
Kann man das so anfangen?
// CSV-Datei auf Unikate bereinigen $myCsvArray = explode("\n",file_get_contents($csv_datei));
geht auch in einem Rutsch mit file. Die Funktion liest jede Zeile in ein Array-Element ein.
// CSV-Datei auf Unikate bereinigen
$myCsvArray = file($csv_datei);
$myCsvArray = array_unique($myCsvArray);
Das sieht soweit grundsätzlich richtig aus.
// Original löschen if(file_exists($csv_datei)) { unlink($csv_datei); } // Neue Datei schreiben ...
Du kannst die Datei auch überschreiben. Damit brauchst du diesen Block nimmer mehr.
Und wie schreibe ich die Daten dann am besten wieder in die Datei?
$datei = fopen("csv_datei.csv","a"); fwrite($datei, ??? ); fclose($datei);
Wie oben gesagt, du kannst die Datei auch überschreiben, ohne sie vorher zu löschen. Dazu brauchst du einen anderen Modus zum öffnen der Datei als "a"
. Der Modus "w"
bietet sich an, da die Datei auf die Länge 0 gebracht wird und der Zeiger/Cursor damit am Anfang der nun leeren Datei gesetzt wird.
Aus der Doku zu fopen (Abschnitt „mode“ [1], Modus "w"
): „Nur zum Schreiben geöffnet; platziere Dateizeiger auf Dateianfang und kürze die Datei auf eine Länge von 0. Existiert die Datei nicht, versuche, diese zu erzeugen.“
Weiterhin musst du dafür sorgen, dass in der Zeit der Schreiboperation niemand anderes auf die Datei zugreifen kann. Das kannst du mit der Funktion flock
erreichen.
$datei = fopen("csv_datei.csv", "w");
if (flock($datei, LOCK_EX)) {
fwrite($datei, implode("\n", $myCsvArray));
flock($datei, LOCK_UN);
}
fclose($datei);
[edit]: Der Volsltändigkeit halber sei hinzugefügt, dass die Alternative zu fopen
, flock
, fwrite
und fclose
die Verwendung von file_put_contents
ist, die diesen Block in einer Funktion vereinigt.[/edit]
Also den Inhalt mit file
einlesen, ihn mit array_unique
behandeln und ihn zu guter Letzt mit dem Block direkt hier drüber [edit](oder mit file_put_contents
)[/edit] wieder in die Datei schreiben.
Tschö, Auge
Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
Hohle Köpfe von Terry Pratchett
Früher™️ gab es für Abschnitte einer PHP-Doku-Seite IDs, auf die man verlinken konnte. Nun nicht mehr. 👎 😟 ↩︎