Ralphi: Probleme beim Auslesen einer Datei mit Zeilenumbruch

Hallo zusammen,

ich lese eine Datei aus und schreibe sie in eine Datenbank.

Dummerweise ist eine zeile mit einem feldinhalt mit tabs und zeilenumbruch versehen.

zB.
1. Cartridges
2. 4071 OnStream ADR30 ADR, 15/30 GB 80,00
3. 4070 OnStream ADR50 ADR, 25/50 GB 90,00

um die Kategorie zu bekommen schreibe ich folgendes:

$zeile = fgets($datei,1000);
 $feld = explode("\t",$zeile);

if ($feld[0] != "") {
  //$katn = $zeile;
  $katn = $feld[0];
 }

bekomme aber in die Datenbank als Inhalt: "Cartridges" tab tab tab \r\n'

hat jemand eine Idee, wie ich nur den text bekomme?
danke
Ralphi

  1. Hello,

    ich lese eine Datei aus und schreibe sie in eine Datenbank.

    Dummerweise ist eine zeile mit einem feldinhalt mit tabs und zeilenumbruch versehen.

    zB.

    1. Cartridges
    2. 4071 OnStream ADR30 ADR, 15/30 GB 80,00
    3. 4070 OnStream ADR50 ADR, 25/50 GB 90,00

    um die Kategorie zu bekommen schreibe ich folgendes:

    $zeile = fgets($datei,1000);
     $feld = explode("\t",$zeile);

    if ($feld[0] != "") {
      //$katn = $zeile;
      $katn = $feld[0];
     }

    bekomme aber in die Datenbank als Inhalt: "Cartridges" tab tab tab \r\n'

    Das ist wohl wieder ein "Unschitbarkeits-Probelm"?
    Hast Du denn schon mal reingeschaut, was in $feld[0] drinsteht?
    Welchen Grund könnte das wohl haben, dass die if-Bedingung nie wahr wird?
    Welche Zeichen sieht man nicht, obwohl sie da sind?
    Und wie bekommt man sie weg? --> http://de3.php.net/manual/de/function.trim.php

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hi Tom,

      mit de trim hab ich probiert, leider erfolglos:

      $katn = trim($feld[0]);

      Auszug aus dem Inhalt der Datenbank:

      1, '2004-07-19 10:25:12', 'Batterie/Akku    \r\n', 30007, 'Varta Mignon NiCd Accu+'

      hinter 'Batterie/Akku immer noch tab und \r\n'
      was mach ich falsch?

      ralphi

      Das ist wohl wieder ein "Unschitbarkeits-Probelm"?
      Hast Du denn schon mal reingeschaut, was in $feld[0] drinsteht?
      Welchen Grund könnte das wohl haben, dass die if-Bedingung nie wahr wird?
      Welche Zeichen sieht man nicht, obwohl sie da sind?
      Und wie bekommt man sie weg? --> http://de3.php.net/manual/de/function.trim.php

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      1. Hello,

        mit de trim hab ich probiert, leider erfolglos:

        $katn = trim($feld[0]);

        Auszug aus dem Inhalt der Datenbank:

        1, '2004-07-19 10:25:12', 'Batterie/Akku    \r\n', 30007, 'Varta Mignon NiCd Accu+'

        hinter 'Batterie/Akku immer noch tab und \r\n'
        was mach ich falsch?

        Du beachtest das Satzformat der Quelle nicht.
        Es sieht also so aus, als hättest Du da eine CSV-Datei, denn ich sehe Kommata...

        Liegt die Datei auf einem Linux-System?
        Dann gib mal

        hexdump -C <dateiname> ein

        Das sieht dann ungefähr so aus:

        thomas@testserver:~/public_html/test/debug$ hexdump -C kontrolle.php
        00000000  3c 3f 70 68 70 20 20 20  20 23 23 23 20 6b 6f 6e  |<?php    ### kon|
        00000010  74 72 6f 6c 6c 65 2e 70  68 70 20 23 23 23 0a 0a  |trolle.php ###..|
        00000020  24 73 63 72 69 70 74 20  3d 20 22 6b 6f 6e 74 72  |$script = "kontr|
        00000030  6f 6c 6c 65 2e 70 68 70  22 3b 0a 0a 65 63 68 6f  |olle.php";..echo|
        00000040  20 22 3c 70 72 65 3e 22  3b 0a 65 63 68 6f 20 22  | "<pre>";.echo "|
        00000050  3c 68 32 3e 50 4f 53 54  2d 56 61 72 69 61 62 6c  |<h2>POST-Variabl|
        00000060  65 6e 3c 2f 68 32 3e 22  3b 0a 70 72 69 6e 74 5f  |en</h2>";.print_|
        00000070  72 28 24 5f 50 4f 53 54  29 3b 0a 65 63 68 6f 20  |r($_POST);.echo |
        00000080  22 3c 68 72 3e 22 3b 0a  65 63 68 6f 20 22 3c 68  |"<hr>";.echo "<h|
        00000090  32 3e 47 45 54 2d 56 61  72 69 61 62 6c 65 6e 3c  |2>GET-Variablen<|
        000000a0  2f 68 32 3e 22 3b 0a 70  72 69 6e 74 5f 72 28 24  |/h2>";.print_r($|
        000000b0  5f 47 45 54 29 3b 0a 65  63 68 6f 20 22 3c 68 72  |_GET);.echo "<hr|
        000000c0  3e 22 3b 0a 65 63 68 6f  20 22 3c 68 32 3e 43 4f  |>";.echo "<h2>CO|
        000000d0  4f 4b 49 45 2d 56 61 72  69 61 62 6c 65 6e 3c 2f  |OKIE-Variablen</|
        000000e0  68 32 3e 22 3b 0a 70 72  69 6e 74 5f 72 28 24 5f  |h2>";.print_r($_|
        000000f0  43 4f 4f 4b 49 45 29 3b  0a 65 63 68 6f 20 22 3c  |COOKIE);.echo "<|

        und poste davon mal so ca. 20 Zeilen

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hello Ralphi,

          ich ahbe die Datei bekommen und sie mir mit dem Hexeditor angeschaut.
          Es ist ein ganz einfaches Dateiformat:

          Fünf Spalten pro Datensatz
            In der ersten Spalte steht die Warengruppe
            Spalte 2 bis 5 enthalten die Daten.

          Die Warengruppe wird immer nur einmal angegeben, Dann folgt der Block mit den
            zugehörigen Artikeln. Das ist so ähnlich, wie bei Datanorm. Solche Formate
            nennt man auch "einfaches Sichtformat", weil man beim Draufgucken auf den Ausdruck
            sofort die Struktur erkennt, im Wust der Bits und Bytes aber ggf. schon durcheinander
            kommt.

          Also Die Datei in einem neutralen Editor (der die Daten nicht verändert) laden und den Kopf abschneiden, denn Lieferbedingungen sind keine Artikel. Das geht nur mit Sichtprüfung, da keinerlei Start-Stoppmarken oder Kopflängen-Paramter vorhanden sind.

          Dann die Dateimin ein Array einlesen. Bei 122kB (wenn es die ganze Datei war) ist das noch kein Problem.

          $_lines = file("dateiname");

          Und dann umkopieren in ein neues Array:

          $_data = array();
          $wgr = "";
          foreach ($_lines as $rec_str)
          {
            ## Newline abschneiden, es verschwinden auch die leeren Spalten
            $rec_str = rtrim($rec_str);

          ## Zeile in (fünf) Spalten zerlegen
            $_rec = explode("\t",$rec_str);

          ## Warengruppe feststellen
            if (strlen(trim($_rec[0]))>0)
            {
              $wgr = trim($_rec[0]);
            }
            else
            {
              ## Warengruppe in Spalte einstanzen
              $_rec[0] = $wgr;

          ## Artikel in Array der Artikel übertragen
              $_data[] = $_rec;
            }
          }

          Das ergibt dann das Array aller Artikel, die Du dann mittels erneutem foreach() und

          Insert into

          In die Tabelle verfrachten kannst.

          Bei 1500 Datensätzen kein Problem, sonst gibt es noch genügend Optimierungsmöglichkeiten.

          Du könntest auch mit Update und als ID die Artikelnummer aus $_data[$n][1] arbeiten...

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          1. Hi Tom,

            nachdem Du mir bestätigt hast wie der Aufbau der Datei ist, hab ich mir gerade noch mal das php-file angesehen.

            nach dem ich die zeile auslese:
            $zeile = fgets($datei,1000);

            und in Spalten zerupfe:
            $feld = explode("\t",$zeile);

            und dann kuck ob die erste spalte die kategorie für die nachfolgenden zeilen hat:
             if ($feld[0] != "") {

            hole ich mir die kat statt wie früher:
            $katn = $zeile;
            natürlich mit
            $katn = $feld[0];
            und schon klappts :)

            hab ich eigentlich schon gestern geändert. aber wär zu blöd zu aktualisieren.
            -- wenn dumme der blitz trefen sollte, sollte ich besser nicht ins gewitter gehen.

            mit großen arrays hab ich unter php noch nicht gearbeitet. weis noch nicht, wie ich damit richtig handtiere

            vielen dank noch mal
            ralphi