Probleme beim Auslesen einer Datei mit Zeilenumbruch
Ralphi
- php
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
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.
- Cartridges
- 4071 OnStream ADR30 ADR, 15/30 GB 80,00
- 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
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.phpHarzliche Grüße aus http://www.annerschbarrich.de
Tom
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
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
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