PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : daten einlesen aus trennzeichen getrennter textdatei


flobee
18.07.2002, 17:50:11
hallo!
ich möchte gern aus einer textdatei (od. auch CSV) daten importieren und später in mysql speichern.
das verteilen der inhalte (arrays) ist mir so einigermassen klar aber ich benötige wohl einen tip wie ich die datei überhaupt lesen kann um die values zu erfassen.
das geht wohl mit "fopen" aber wie kann ich nun die einzelnen zeilen erfassen wenn ich z.b. folgende werte in der txt datei habe
name1;name2;wert3;wert4;wert5;;;wert8;
name1;;wert3;wert4;;;;wert8;
;;wert3;wert4;wert5;;;;

gruß flobee

Matt
18.07.2002, 18:08:14
hi!
es gibt eine funktion, die extra dafür gemacht ist:
fgetcsv

näheres dazu findest du bei
www.php.net/fgetcsv

flobee
18.07.2002, 18:45:49
yo! danke! schau ich mir mal gleich an!
bin aber auch hier schon schleu geworden!
de.comp.lang.phpq-datei-lesen.html || http://www.dclp-faq.de/

und damit andere was von diesen post haben:

$fp = @fopen("$textfile", "r") or die ("Kann Datei nicht lesen.");
while ($line = fgets($fp, 1024)):
echo "$line <br>";
endwhile;
fclose($fp);

obwohl ich immer noch nicht weiss warum gerade die1024 für eine zeile gilt !?

c4
18.07.2002, 19:56:22
$fp = @fopen("$textfile", "r") or die ("Kann Datei nicht lesen.");
while ($line = fgets($fp, 1024)):
echo "$line <br>";
endwhile;
fclose($fp);

obwohl ich immer noch nicht weiss warum gerade die1024 für eine zeile gilt !?

Dieses Skript enthält doch keinen Befehl, um die Zeile aus der Textdatei an den Seperatoren aufzu-split-ten. http://www.php.net/split und http://www.php.net/explode sind dafür gedacht. Das was Matt geschrieben hat eigentlich noch mehr.

Die 1024 gibt nur an, wie viele Zeichen pro Zeile ausgelesen werden sollen. Hat die Zeile weniger Zeichen, kommt einfach die nächste Zeile dran. Hat sie mehr... ähm ... testen!

MfG

Matt
19.07.2002, 10:41:53
mit fgetcsv kannst du als drittes argument gleich noch einen seperator angeben, dann hast du das ganze in einem array drin, welches du mit einer foreach schleife ausgeben kannst. Beispiele gibts von mir absichtlich keine ;)

1024 gibt eben wie gesagt an, was die maximale anzahl der zeichen einer zeile ist, ist die tatsächliche geringer, macht das garnix, dann hört er einfach beim
zum lesen auf, ist es mehr, schneidet er an der stelle ab...

flobee
19.07.2002, 10:47:07
warum gibst du absichtlich keine beispiele!? welch ironie der beteiligung in diesem forum!?
aber vielleicht kannst du ja dennoch helfen

ich bin davon ausgegagen das ich das mit dem array dann hinbekomme ... aber wie es aussieht gibts ein problem

$fp = @fopen("$textfile", "r") or die ("Kann Datei nicht lesen");
while ($line = fgets($fp, 1024)) {
$line = ereg_replace(""", "", $line);
$impdata = explode("$delimiter", $line);
$impdatanum = count($impdata);

echo "<TR>
";
for($x==0;$x<$impdatanum;$x++) {
makeopi($x); // auswahl <option> f. zuweisung d. datensätze
}
echo "</tr>
<TR>
";
for($d==0; $d<$impdatanum; $d++) {
echo "<td>".$impdata[$d]."</td>"; // anzeigen importierter daten (zum vorsortieren)
}
echo "</tr>
";

} // end while
fclose($fp);

für mich ist diese hier LOGISCH allerdings ist die ausgabe der zeiten FOR schleife jenseits dem war ich erwarte!
eine csv datei mit verschiedenen werten und mehreren datensätzen aber $impdata[0] wird nicht angezeigt und alle weiteren zeilen werden scheinbar als "" (ohne inhalt) ausgegeben

sieht jemand den fehler?

flobee
19.07.2002, 10:53:24
hm...habs gerde eine lösung gefunden der zweiten for schleife duch ersetzen durch foreach allerding sollte es doch wie oben auch gehen oder? zumal ich diese anzeige fürs erste auf 5 zeilen limitieren wollte... es soll ein import tool für text,csv datein werden

Matt
19.07.2002, 12:03:04
also wenn dein gepostetes script vollständig ist, weiss ich, was fehlt:
$delimiter ist leer, deshalb wird in deinem array auch alles in den ersten (0ten) eintrag geschrieben, weil er nach einem null-sperator sucht und den findet er nicht!
in einer for-schleife hat das erste argument immer nur ein =, zwei wären ein logisches istgleich, was einen vergleich darstellt, ein einfaches ist gleich weist dem linken wert den rechtsstehenden zu.
ich gebe deshalb keine beispiele, weil ich der ansicht bin, dass es für dich keinen lerneffekt hat. Ist wirklich nicht bösartig oder gemein oder eingebildet von mir, wenn du nach einem script gefragt hättest, hätte ich dir eines gegeben, du hättest es angeschaut, kopiert und beim nächsten mal wieder das genommen und wärst damit um das software-entwickeln herumgekommen, was jedoch der wichtige schritt beim programmieren ist: die lösung für seine vorgegebenen ziele zu finden, sprich du musst draufkommen, wie du etwas mit gegebenen mitteln lösen kannst, sonst hast du nicht 1/4 des lerneffektes. Schließlich wirst auch du eine eigene art der problemlösung finden, wobei es keine gute idee ist (meiner meinung nach) diese aus der adaption anderes codes zu bekommen. Das ganze kann nur funktionieren, wenn du selbst ideen kriegst, wie du etwas lösen sollst. deshalb habe ich dir nur die notwendigen hilfsmittel gegeben, die du dafür brauchen wirst.
Ich hätte auch gleich folgendes posten können (achtung: code ist aus hirn getippt, fehler sicherlich enthalten!):


<table>
<?
$file=fopen("datei.csv",r);
while( $line=fgetcsv($file,";") )
{
print "<tr>";
foreach($line as $cell) print "<td>$cell</td>";
print "</tr>";
/* die ersten fünf auslesen,
das statt der foreach schleife verwenden:
for($i=0;$i<5;$i++)
{
print "<td>".$line[$i]."</td>";
}
*/
?>
}
?>
</table>


Nur hättest du das script dann nicht selbst geschrieben, verstehst du?

flobee
19.07.2002, 17:24:15
yupp! :-)
und genau in wie in deiner for scheife hatte ich gestern das problem (delimiter war ";" ) und die ausgabe war da aber nur für die erste zeile ab [1]...++ und alle anderen zeilen waren "" und nicht wie du beschrieben hattest alles in einem!
aber heut gehts! scheint mal wieder am WINdoof vs. Apache zu liegen!?
aber selbst ";" und csv beissen sich ja ein wenig!
was macht denn das fgetcsv() genau? -> daten die in dubblequotes eingeschlossen sind und mit trennzeichen x von einander getrennt sind, verarbeiten nzw in ein array legen!?
ich möchte eine möglichst gute ALLround version bauen und habe deshalb nicht diese funktion genommen da ich bei php.net nachgelesen habe das es wohl ein paar komplikationen geben kann.
allerdings habe ich die php befehle noch nicht drauf um ein gutes work around zu bauen.... von daher hab ich ersteinmal solch eine funktion: $line = trim(ereg_replace(""", "", $line)); die mir die csv-quotes erst mal weg macht! aber: ich habe nicht immer eine csv datei als datensatz! wie bauen den die profis solch importer?
eine abfrage via html input wie die datenquelle aussieht und dann für jeden fall eine extra funktion schreiben?.......
und was macht man wenn ein datensatz selbst ein trennzeichen enthält!? ich denke da gerade an die leute die einfach ihre daten duch diesen importen schleifen wollen... und das wollen sie meisst ohne viel lesen und nacharbeiten der quell datei..
kannst du mir folgen!? :-)
aber schon mal danke für deine tips! haben mich dennoch weiter gebracht!