Frage

Ich versuche, Daten aus a.csv Datei zu lesen, es auf einer Webseite als Text ouput.

Es ist das erste Mal, dass ich das tue, und ich habe in ein fieses kleines Problem führen.

Meine CSV-Datei (die von Excel standardmäßig openened wird), mehrere Zeilen hat und ich lese die ganze Sache als eine lange Zeichenfolge.

wie folgt aus:

$contents = file_get_contents("files/data.csv");

In diesem Beispiel Datei, die ich gemacht, gibt es 2 Linien.

  

Paul Blueberryroad   85 uns Taschenlampe, Tasche, 20. November   2008, 04.39

     

Hellen Blueberryroad   85 uns lens13mm, Taschenlampe, Tasche, ExtraBatteries November   20, 2008, 16.41.32

Aber die Zeichenfolge gelesen von PHP ist dies:

Paul; Blueberryroad 85; uns, Taschenlampe, Tasche, 20. November 2008, 04.39 pmHellen; Blueberryroad 85; uns; lens13mm, Taschenlampe, Tasche, ExtraBatteries, 20. November 2008, 16.41.32

Ich Aufspalten dies mit:

list($name[], $street[], $country[], $accessories[], $orderdate[]) = split(";",$contents);

Was ich will, ist für $ name [] „Paul“ und „Hellen“ als Inhalt enthalten. Und die anderen Anordnungen die Werte ihrer jeweiligen Spalten erhalten.

Stattdessen erhalte ich nur Paul und der Inhalt von $ bestelldatum [] ist

  

20. November 2008, 04.39 pmHellen

So werden alle Zeilen verkettet sind. Kann mir jemand zeigen, wie ich erreichen kann, was ich brauche?

EDIT: Lösung gefunden, nur ein werid Sache noch:

Ich habe es jetzt gelöst durch dieses Stück Code verwendet:

$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);

Aus irgendeinem Grund allthough meine CSV-Datei nur zwei Zeilen hat, gibt es zwei Arrays und 1 boolean. Die ersten 2 sind meine Daten-Arrays und die boolean 0.

War es hilfreich?

Lösung

Sie sind besser dran mit fgetcsv () die aus CSV-Datei-Struktur bekannt ist und hat Optionen bezeichnet für CSV-Dateien verarbeitet werden. Alternativ können Sie str_getcsv () auf den Inhalt Verwendung von die Datei statt.

Andere Tipps

Datei () Funktion eine Datei in einem Array liest, ist jede Zeile ein Eintrag der Array.

Sie können also wie etwas tun:

$rows = array();
$name = array();
$street = array();
$country = array();

$rows = file("file.csv");
foreach($rows as $r) {
    $data = explode(";", $r);
    $name[] = $data[0];
    $street[] = $data[1];
    $country[] = $data[2];
}

Ich habe es jetzt gelöst durch dieses Stück Code verwendet:

$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);

Aus irgendeinem Grund allthough meine CSV-Datei nur zwei Zeilen hat, gibt es zwei Arrays und 1 boolean. Die ersten 2 sind meine Daten-Arrays und die boolean 0.

Die Bemerkung über fgetcsv korrekt ist.

Ich werde noch Ihre Frage beantworten, für Ausbildungszwecke. Das erste, was ich nicht den Unterschied zwischen Ihren Daten verstehen (mit Kommata) und die „string gelesen von PHP“ (es ersetzt einige Räume mit Semikolon, aber nicht alle?). PS .: Ich auf den Quellcode Ihrer Nachricht sah, es sieht aus wie eine seltsame Mischung aus TSV (Tabs) und CSV (Koma).

Neben, wenn Sie diesen Weg gehen möchten, müssen Sie zunächst die Datei in Zeilen aufgeteilt, dann die Zeilen in Felder.

Der beste Weg ist natürlich fgetcsv (), wie aufgezeigt.

$f = fopen ('test.csv', 'r');
while (false !== $data = fgetcsv($f, 0, ';'))
    $arr[] = $data;
fclose($f);

Aber wenn Sie den Inhalt in einer Variablen haben und wollen, dass es spalten, und str_getcsv ist nicht verfügbar Sie diese verwenden können:

function str_split_csv($text, $seperator = ';') {
    $regex = '#' . preg_quote($seperator) . '|\v#';
    preg_match('|^.*$|m', $text, $firstline);
    $chunks = substr_count($firstline[0], $seperator) + 1;
    $split = array_chunk(preg_split($regex, $text), $chunks);
    $c = count($split) - 1;
    if (isset($split[$c]) && ((count($split[$c]) < $chunks) || (($chunks == 1) && ($split[$c][0] == ''))))
        unset($split[$c]);
    return $split;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top