csv Datei von Duplikaten befreien
bearbeitet von
Hallo
> ich will mir gerade eine Funktion schreiben, die eine CSV-Datei von Duplikaten befreit.
>
> Kann man das so anfangen?
>
> ~~~ PHP
> // CSV-Datei auf Unikate bereinigen
> $myCsvArray = explode("\n",file_get_contents($csv_datei));
> ~~~
geht auch in einem Rutsch mit [file](https://www.php.net/manual/de/function.file.php). Die Funktion liest jede Zeile in ein Array-Element ein.
~~~ PHP
// CSV-Datei auf Unikate bereinigen
$myCsvArray = file($csv_datei);
~~~
> ~~~ PHP
> $myCsvArray = array_unique($myCsvArray);
> ~~~
Das sieht soweit grundsätzlich richtig aus.
> ~~~ PHP, bad
> // Original löschen
> if(file_exists($csv_datei)) {
> unlink($csv_datei);
> }
> // Neue Datei schreiben
> ...
> ~~~
Du kannst die Datei auch *über*schreiben. Damit brauchst du diesen Block nimmer mehr.
> Und wie schreibe ich die Daten dann am besten wieder in die Datei?
>
> ~~~ php
> $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](https://www.php.net/manual/de/function.fopen.php) (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`](https://www.php.net/manual/de/function.flock.php) erreichen.
~~~ php
$datei = fopen("csv_datei.csv", "w");
if (flock($datei, LOCK_EX)) {
fwrite($datei, implode("\n", $myCsvArray));
flock($datei, LOCK_UN);
}
fclose($datei);
~~~
Also den Inhalt mit `file` einlesen, ihn mit `array_unique` behandeln und ihn zu guter Letzt mit dem Block direkt hier drüber wieder in die Datei schreiben.
Tschö, Auge
[^1]: Früher™️ gab es für Abschnitte einer PHP-Doku-Seite IDs, auf die man verlinken konnte. Nun nicht mehr. 👎 😟
--
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
csv Datei von Duplikaten befreien
bearbeitet von
Hallo
> ich will mir gerade eine Funktion schreiben, die eine CSV-Datei von Duplikaten befreit.
>
> Kann man das so anfangen?
>
> ~~~ PHP
> // CSV-Datei auf Unikate bereinigen
> $myCsvArray = explode("\n",file_get_contents($csv_datei));
> ~~~
geht auch in einem Rutsch mit [file](https://www.php.net/manual/de/function.file.php). Die Funktion liest jede Zeile in ein Array-Element ein.
~~~ PHP
// CSV-Datei auf Unikate bereinigen
$myCsvArray = file($csv_datei);
~~~
> ~~~ PHP
> $myCsvArray = array_unique($myCsvArray);
> ~~~
Das sieht soweit grundsätzlich richtig aus.
> ~~~ PHP, bad
> // Original löschen
> if(file_exists($csv_datei)) {
> unlink($csv_datei);
> }
> // Neue Datei schreiben
> ...
> ~~~
Du kannst die Datei auch *über*schreiben. Damit brauchst du diesen Block nimmer mehr.
> Und wie schreibe ich die Daten dann am besten wieder in die Datei?
>
> ~~~ php
> $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](https://www.php.net/manual/de/function.fopen.php) (Abschnitt „mode“ [^1]):„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`](https://www.php.net/manual/de/function.flock.php) erreichen.
~~~ php
$datei = fopen("csv_datei.csv", "w");
if (flock($datei, LOCK_EX)) {
fwrite($datei, implode("\n", $myCsvArray));
flock($datei, LOCK_UN);
}
fclose($datei);
~~~
Also den Inhalt mit `file` einlesen, ihn mit `array_unique` behandeln und ihn zu guter Letzt mit dem Block direkt hier drüber wieder in die Datei schreiben.
Tschö, Auge
[^1]: Früher™️ gab es für Abschnitte einer PHP-Doku-Seite IDs, auf die man verlinken konnte. Nun nicht mehr. 👎 😟
--
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