Seite 1 von 1

fgetcsv() bzw. eigene csv Funktion für String

Verfasst: 19.04.2007 16:48
von mgutt
Hallo,

meine Frage war:
gibt es irgendwo eine fertige Funktion für csv-Zeilen wie z.B.:

Code: Alles auswählen

// getcsv ($var, $Trennzeichen, $Texterkennungszeichen, $Texterkennungszeichen_löschen)
getcsv($string, ";", '"');
Zwischenzeitlich habe ich selbst was geschrieben:

Code: Alles auswählen

<?php

function getcsv($var, $delimiter=';', $field_delimiter='"', $rfd=false)
{
	// standard: '#("[^"]*"|[^";]+)#'
	$pattern = '#(' . $field_delimiter . '[^' . $field_delimiter . ']*' . $field_delimiter . '|[^' . $field_delimiter . '' . $delimiter . ']+)#';
	preg_match_all($pattern, $var, $matches);
	$matches = $matches[1];
	if ( $rfd )
	{
	 	$matches = str_replace($field_delimiter, '', $matches);
	}
	return $matches;
}

$var = '"text1";"text2";"text3;text4;text5";0.00;"text6";10;1234;"text7";text8;"";"text9";"";"text10"';

echo('<pre>');
print_r(getcsv($var, ';', '"'));
print_r(getcsv($var, ';', '"', true));
echo('</pre>');

?>
Das Ergebnis:

Code: Alles auswählen

Array
(
    [0] => "text1"
    [1] => "text2"
    [2] => "text3;text4;text5"
    [3] => 0.00
    [4] => "text6"
    [5] => 10
    [6] => 1234
    [7] => "text7"
    [8] => text8
    [9] => ""
    [10] => "text9"
    [11] => ""
    [12] => "text10"
)
Array
(
    [0] => text1
    [1] => text2
    [2] => text3;text4;text5
    [3] => 0.00
    [4] => text6
    [5] => 10
    [6] => 1234
    [7] => text7
    [8] => text8
    [9] => 
    [10] => text9
    [11] => 
    [12] => text10
)
Kommentare und Kritik sind erwünscht.

Gruß

Verfasst: 20.04.2007 15:47
von gn#36
Was machst du wenn Anführungszeichen im Text vorkommen? Du müsstest die Maskierung noch erkennen oder? (z.b. mit Backslash oder wie auch immer das normalerweise maskiert wird).

Verfasst: 21.04.2007 16:54
von mgutt
Das ist eben die Frage. Es gibt ja nicht wirklich einen Standard dafür.

Gibt es csv Dateien, die Anführungszeichen im Text haben und mit Backslash maskiert wurden?

Gruß

Verfasst: 21.04.2007 17:24
von Stefane
Servus,

also ich kenne diese Funktion: fgetcsv.
Bei dieser kannst du auch das Trennzeichen separat angeben.
Diese Funktion ist auch speziell dazu, um CSV-Dateien auszulesen. Ich verwende diese Funktion selbst in einem Script von mir. Funktioniert ohne Probleme.
Ich hoffe, das ist das, was du suchst und dass wir nich aneinander vorbeireden!?!

Verfasst: 21.04.2007 17:37
von mgutt
Hi,

es ist nicht von ungefährt, dass die Funktion von mir getcsv() heißt.

fgetcsv funktioniert aber nur bei einem Filestream.

Wenn Du die Datei aber mit file() oder file_get_contents() einliest hilft die Dir nicht weiter.

Gruß
Marc

Verfasst: 21.04.2007 21:44
von Pyramide
mgutt hat geschrieben:fgetcsv funktioniert aber nur bei einem Filestream.

Wenn Du die Datei aber mit file() oder file_get_contents() einliest hilft die Dir nicht weiter.
Ein Grund mehr, auf das sinnlose aufteilen in mehrere Dateien zu verzichten. :roll:

Verfasst: 22.04.2007 00:32
von gn#36
Also ich denke es gäbe da mehrere Versionen:
1.
- Zellen von ; getrennt
- Wenn keine ; im Zellentext sind, dann keine Maskierung des Inhalts, ansonsten Anführungszeichen (") um den Inhalt bis zum nächsten Semikolon.
- Wenn Anführungszeichen vorhanden sind, werden diese verdoppelt

Diese Version scheint z.b. von Excel beim erstellen von CSV verwendet zu werden.

2.
- Zellen von ; getrennt
- Um den Zellinhalt stehen grundsätzlich immer Anführungszeichen
- Enthaltene Anführungszeichen werden verdoppelt um sie von den Anfangs-/Endzeichen abzuheben.

Diese Version halte ich für sinnvoll.

Verfasst: 22.04.2007 12:45
von mgutt
Pyramide hat geschrieben:
mgutt hat geschrieben:fgetcsv funktioniert aber nur bei einem Filestream.

Wenn Du die Datei aber mit file() oder file_get_contents() einliest hilft die Dir nicht weiter.
Ein Grund mehr, auf das sinnlose aufteilen in mehrere Dateien zu verzichten. :roll:
So sinnlos ist das nicht, da ich die Datei nicht in einem abarbeite, sondern jeden Split durch den Besucher einzeln abarbeiten lasse.

Anders müsste ich die letzte Zeile herannehmen, die zwischenspeichern usw. ne.. im Moment ist das schön einfach :D

Verfasst: 22.04.2007 16:01
von Stefane
hi, schaut mal, was mir gerade über den Weg gelaufen ist...
http://de2.php.net/manual/de/function.str-getcsv.php

Also gibt es solch eine Funktion wohl doch.