halfbrain: PHP: Zerlegung von Zeichenkette (mehrere Leerzeichen) funktioniert nicht

Hallo allerseits,

ich versuche gerade eine CSV-Datei zu parsen (Ausschnitt):

"3"	"xx.xx.2017"	"VISA Card Kartenumsatz"	"AMAZON DE RETAIL AMA AMAZON   4532xxxxxxxx4657   VISA AMAZON.DE            5999LU        1x,xxEUR VOM xx.xx      1035   "	""	""	""	""	""	"xx.xx.2017"	"1x,xx"	""

Die Spalte 3 (4. von links) versuche ich nun mit einem PHP-Skript zu parsen, um die erste Zeichenkette "AMAZON DE RETAIL AMA AMAZON" (bis zum ersten Vorkommen von 3 Spaces) zu extrahieren:

<?php
ini_set("auto_detect_line_endings", true);
$row = 1;
mb_regex_encoding("UTF-8");
#echo mb_regex_encoding();

if (($handle = fopen("vw-data.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) {
        $num = count($data);
        $row++;
        echo $data[3] . "<br>\n";
        #print_r(str_getcsv($data[3], "\s"));
        #print_r(explode("    ", $data[3]));
        print_r(preg_split("/ {2,}/", $data[3]));
        #echo ord(" � � ");
        if ($row > 2)
          exit;
    }
    fclose($handle);
}
?>

Aber egal wie ich es versuche (preg_split(), mb_split(), explode()), ich kann immer nur bei einem Space splitten (/ /, /\s/ usw.), sobald ich es mit zwei oder mehr versuche wird der String gar nicht mehr gesplittet (/ /, / {2,}/, /\s{2,}/ usw.). Ich habe keine Ahnung was ich falsch mache.

Kann mir jemand helfen?

VG halfbrain

P.S. Ich nutze PHP 5.5.38 auf Mac OS 10.11.6. Die CSV-Datei ist (vermutlich) UTF-8.

  1. $data[3] = str_replace("\x00", '', $data[3]);

    Die Null-Bytes zwischen den Spaces waren das Problem…

    1. Die Null-Bytes zwischen den Spaces waren das Problem…

      Für nullterminierte Strings gibt es Schablone Z (ab v.5.5). Wirf mal ein Blick in die Doku.

      MfG

  2. Tach!

    Aber egal wie ich es versuche (preg_split(), mb_split(), explode()), ich kann immer nur bei einem Space splitten (/ /, /\s/ usw.), sobald ich es mit zwei oder mehr versuche wird der String gar nicht mehr gesplittet (/ /, / {2,}/, /\s{2,}/ usw.). Ich habe keine Ahnung was ich falsch mache.

    Hast du überprüft, dass das Leerzeichen sind? Lass dir mal mit urlencode() ausgeben, was du da zu bearbeiten versuchst. (urlencode() ist zwar keine Debug-Funktion, kann aber gut missbraucht werden, um die Byte-Werte anzuzeigen.)

    dedlfix.

  3. Hallo,

    das ist keine CSV-Datei.
    Siehg nach einer Merkwürdig gemischten Dateiform aus. Einerseits Stringbegrenzer, andererseits keine (sichtbaren) Feldtrenner, große Lücken. Große Lücken sieht nach direct Access aus, also feste Satzlänge.

    Bei Heise gibt es einen netten Hexeditor für Windows zum Download. Damit kann man sich dann dann besser ansehen. Den Link bitte mal selber suchmaschinieren. Ich hab nur mobiles Netz heute.

    LG
    RoRo

    1. Hallo Robert,

      das ist keine CSV-Datei.

      Ich glaube nicht, dass du da recht hast.

      Siehg nach einer Merkwürdig gemischten Dateiform aus. Einerseits Stringbegrenzer, andererseits keine (sichtbaren) Feldtrenner, große Lücken. Große Lücken sieht nach direct Access aus, also feste Satzlänge.

      Tab als Feldtrenner, die „Stringbegrenzer” sind Teil von CSV, PHP unterstützt das auch (siehe $enclosure und $escape).

      LG,
      CK

      1. Hallo Christian,

        das ist keine CSV-Datei. Ich glaube nicht, dass du da recht hast.

        Das kann man ja auch von außen nicht sehen. Deshalb hatte ich den HEX-Editor empfohlen. Den hatte ich selber vor ein paar Tagen erst heruntergeladen, weil der im Textpad als PlugIn integrierte nicht mehr funktionierte und ich schnell eine Lösung brauchte.

        Man könnte auch die NUL als Trennzeichen benutzen, wenn sonst nur druckbare Zeichen vorkommen.

        Und da hätte mir der Gedanke schon kommen können, dass es vermutlich doch kein Random-Access-Format ist. Dann hätte man die Zahlen auch gleich binär kodieren können :-)

        LG
        RR