PDA

Vollstndige Version anzeigen : Datei auslesen und ndern.


juergen
02-04-2005, 15:04
Hallo Forum,

ich habe eine Text Datei mit ber 15000 Eintrgen die immer gleich sind.
Z.B.
(1,text,20.05.2005),
(1,anderer text,21.05.2005),
(1,noch anderer text,22.05.2005),
usw.
Nun mchte ich die Zahl 1 die ja in jeder Zeile gleich ist fortlaufend um 1 erhhen.
Z.B.
(1,text,20.05.2005),
(2,anderer text,21.05.2005),
(3,noch anderer text,22.05.2005),
usw.

Kann mir einer sagen wie ich das mit PHP erreichen kann?
Ansonsten mu ich das von Hand machen;-((

Gru Jrgen

wolles
02-04-2005, 16:56
Hallo,

schau Dir mal den Befehl file() unter Dateisystemsfunktionen an.
(Sorry, krieg das mit der verlinkten Funktion nicht hin, springt bei mir dann auf http://be.php.net und sucht da vergeblich)
Damit kannst Du die Datei in einen Array lesen.
Dann lsst Du den Array einfach durch eine Schleife laufen und ersetzt das 1 durch einen mitlaufenden Zhler.
Das wrde in etwas so aussehen:

$datei = "deineDatei.txt";
$array = file($datei);
$i=0;
foreach ($array as $zeile) {
$neuezeile[$i]=$i.substr($zeile,1);
$i++;
}
Den Array $neuezeile schreibst Du jetzt wieder in Deine Datei, oder besser noch, falls Du die Mglichkeit hast in eine Datenbank, damit Du die Dateien zuknftig leichter manipulieren kannst.

Ich wei nur nicht, ob so ein Array 15000 Elemente verkraftet, sonst msstest Du das ganze irgendwie zeilenweise auslesen und ndern, aber ich glaube, das drfte viel lnger dauern.

juergen
04-04-2005, 20:46
Hallo Wolles,

danke fr Deine Nachricht aber alles was das Script mir in die neue Datei (ok.txt)schreibt ist "array". Hier mein Code.
<?php
$config_file = "ok.txt";
$textfehler = "Ihre nderungen konnten nicht in [$config_file] gespeichert werden!";
$textreal = "Bin fertig! Die Datei [$config_file] ist neu geschrieben!";

$datei = "17804.txt";
$array = file($datei);
$i=0;
foreach ($array as $zeile) {
$neuezeile[$i]=$i.substr($zeile,1);
$i++;
}

if (is_writable($config_file)) {
if (!$handle = fopen($config_file, "w")) {
print "<b>Kann die Datei $config_file nicht ffnen</b>";
exit;
}
if (!fwrite($handle, $neuezeile)) {
print "<b>Kann in die Datei $config_file nicht schreiben</b>";
exit;
}
fclose($handle);

print "<b>$textreal</b>";
} else {
print "<b>$textfehler</b>";
}
?>
Danke fr die Hilfe.
Gru Jrgen

|Coding
04-04-2005, 21:15
Du willst ja auch ein Array in die Datei schreiben...
Schreib das mal unter deine FOR-Schleife:
$neuezeile = join("n", $neuezeile);

juergen
06-04-2005, 20:52
Hallo Coding,

ich habe es jetzt so gemacht!

$array = file($datei);
$i=1; // weil ja mit 1 beginnen soll
foreach ($array as $zeile) {
$neuezeile[$i]=$i.substr($zeile, 2); //mu hier etwas gendert werden?
$i++;
}
// bei join habe ich den Zeilenumbruch entfernt damit keine leerzeilen vorkommen
$neuezeile = join("", $neuezeile);

Aber ich bekomme folgende Ausgabe.
1,Text,22.05.2005,)
es soll aber: (1,Text,22.05.2005,)
Das erste Zeichen, die ffnende Klammer wird entfernt! Das darf nicht.

Danke und Gru Jrgen

|Coding
06-04-2005, 21:22
$neuezeile[$i]=$i.substr($zeile, 2); //mu hier etwas gendert werden? ja, genau hier

so:

$neuezeile[$i]= '(' . $i.substr($zeile, 2);

wolles
06-04-2005, 22:23
Sorry, hatte nicht gesehen, da die Klammer mit zu Deinem Ausdruck gehrt.
Aber Du hattest ja selber herausgefunden, da Du als Parameter in substr() eine 2 setzen musstest.
substr($xxx,2) liefert Dir den String ab dem 3.Zeichen im String, den Rest davor ersetzt Du ja durch die fortlaufende Zahl. Deswegen musst Du die erste Klammer quasi manuell hinzufgen, wie Coding es gepostet hat.

xabbuh
07-04-2005, 11:00
Ist es denn erwnscht, dass an den Anfang jedes Arrayelementes eine Klammer gesetzt wird? Soll die Klammer nicht nur einmal ganz an den Anfang gesetzt werden:

<?php
$neuezeile = '(' . join('', $neuezeile);
?>

juergen
07-04-2005, 17:50
Hallo Hallo,

jetzt fuztes wie gelt.

Danke fr Eure Hilfe. Gru Jrgen

juergen
07-04-2005, 17:53
Hallo xabbuh,

ne ne ist schon alles so richtig wie Coding es sagt. Am Anfang dieses Themas steht ja ganz eindeutig das jedes mal die Klama gebraucht wird.

Danke fr die Hilfe

juergen
07-04-2005, 18:03
Hallo noch mal ich,

wie gestallte ich ein Script wenn ich zum Beispiel eine Datei habe in der jede Menge HTML Formatierungen stehen (z.B. <tr>, <td>, <dd>, usw.) und immer wieder ein wiederkerender Ausdruck wie z.B.
<span>a, Verschiedener Text, Datum, Uhrzeit,</span> vorkommt und ich nur diesen aus der Datei auslesen will um ihn in eine neue Datei zu schreiben.
Da mu ich doch mit --> $pattern = "=<span>(.*)</span>=i"; arbeiten oder?

Was meint Ihr!
Gru Jrgen und noch mal Danke

|Coding
07-04-2005, 18:08
$pattern = "=<span>(.*)</span>=i";
Probieren geht ber studieren :-)

xabbuh
07-04-2005, 18:09
ne ne ist schon alles so richtig wie Coding es sagt. Am Anfang dieses Themas steht ja ganz eindeutig das jedes mal die Klama gebraucht wird.
Achso, das hatte ich dann wohl berlesen.

Zu deinem aktuellen Problem: Das Ganze kannst du mit regulren Ausdrcken (http://tut.php-q.net/regex.html) und der Funktion preg_match_all() ,machen.

|Coding
07-04-2005, 18:50
"=<span>(.*)</span>=i"
Ist doch ein regulrer Ausdrck...

juergen
07-04-2005, 21:17
Hallo,

so jetzt habe ich es fast geschaft:
$datei = "anfang.txt";
$content = file_get_contents($datei);

$pattern = "=<span>(.*)</span>=i";
preg_match_all($pattern, $content, $matches);
$ausgabe = $matches[1];
$textausgabe = join("<br>", $ausgabe); //Das <br> wegen des Zeilenumbruchs

echo $textausgabe; Hier bekomme ich meine Ausgabe.
Nur noch ein Problem: Mein Suchmuster ist nicht
<span> sondern <span class="text">!
Das class="text" macht Probleme! Wenn ich es entferne gehts.
Ich bekomme diese Meldungen mit dem class="text" angezeigt:
Warning: Unknown modifier 't' in D:ApacheServerxampphtdocstest.php on line 10
Warning: join(): Bad arguments. in D:ApacheServerxampphtdocstest.php on line 12

Was macht man in solch einem Fall?

Gru Jrgen

|Coding
07-04-2005, 21:28
In so einem fall nimmst Du einfach andere Delimiter... und so:

$pattern = "#<span.*>(.*)</span>#i";

juergen
08-04-2005, 15:24
Hallo Coding,

hat funktioniert. Gibt es eigentlich eine Liste aller Delimiter?

So jetzt habe ich also alle Vorkommnisse untereinander stehen, da ich ja <br> im join eingetragen habe. Das ist nicht so gut, da ich nun wieder eine Formatierung habe, die ich nicht gebrauchen kann. Ich mchte alle Vorkommnisse zwar untereinander stehen haben, aber nicht mit einem <br>. Ich mu also das Script dazu bringen, jedes Vorkommnis in eine Zeile zu schreiben.

Weiter mu jedem Vorkommnis noch (1, ' vorangestellt und ', '2005-02-13'), hinten angefgt werden.
Das habe ich nun so gemacht:
$i=1;
foreach ($ausgabe as $zeile) {
$neuezeile[$i]= "($i, '" .substr($zeile, 0);
$i++;
}
$mail = join("', '2005-02-13'),", $neuezeile);
So jetzt mu ich nur noch jedes Vorkommnis untereinander ohne <br> in eine neue leere Datei schreiben. Kannst Du mir da einen Tipp geben, wie ich das am dmmsten hin bekomme?

Danke und Gru Jrgen

|Coding
08-04-2005, 15:27
Gibt es eigentlich eine Liste aller Delimiter?

Die kannst Du frei whlen, Du solltest aber immer einen whlen der im Suchmuster nicht vorkommt, dann musst Du den nicht schtzen.

So jetzt mu ich nur noch jedes Vorkommnis untereinander ohne <br> in eine neue leere Datei schreiben. Kannst Du mir da einen Tipp geben, wie ich das am dmmsten hin bekomme?

//...
$mail = join("', '2005-02-13'),", $neuezeile);
$mail = str_replace('<br>', '', $mail);

juergen
08-04-2005, 18:58
Hallo,

danke fr Deine Tipps. In der Zwischenzeit habe ich es so gemacht.
$mail = join("', '2005-02-13'),n", $neuezeile);
Geht auch!

Jetzt kommt das nchste Problem!
Die Datei ist nun 81458 KB gro und ich will die Daten in einer mysql-Datenbank speichern.----- Das geht nicht mit importieren da phpmyadmin abbricht! Mit einer 1 MB groen Datei funktioniert es gerade noch.
Jetzt denke ich das ich die Daten nicht in eine Datei schreiben werde sondern gleich in die Datenbank! Geht das so einfach. Und da ich das noch nie gemacht habe wird das wohl eine gute bung fr mich sein. Kannst Du mir da die Richtung weisen und mit was ich anfangen soll?

Danke fr alles und viele Gre
Jrgen

|Coding
08-04-2005, 19:17
Dein Problem ist der Timeout, da musst Du einige Sachen beachten um dennoch deine Daten in die DB zubekommen. Schau dir mal "MySQL Dumper" an, damit msstest Du es schaffen: mysqldumper.de (http://www.mysqldumper.de)

juergen
09-04-2005, 11:38
Hallo Coding,

vielen Dank fr Deinen super Tipp. Mit "MySQL Dumper" habe ich es schnell und sehr einfach geschaft. Woher kennst Du das alles?
Ich wrde gern einen online Editor wie dieser hier im Forum bei mir einbauen. Luft der mit Javascript oder PHP?

PS.
Kannst Du mir Lehrbcher ber PHP empfehlen? Etwas was ich auch im Garten auf dem Liegestuhl lesen kann. Ich bin Dir sehr Dankbar fr Deine Hilfe.

Schnes Wochenende, Gru Jrgen

|Coding
09-04-2005, 12:24
Woher kennst Du das alles?
Das bekommt man so mit :)

Ich wrde gern einen online Editor wie dieser hier im Forum bei mir einbauen. Luft der mit Javascript oder PHP?
Mit sehr viel JavaScript...

Kannst Du mir Lehrbcher ber PHP empfehlen?
Das Buch "PHP 5 - Praxisbuch & Referenz" kann ich empfehlen: http://www.amazon.de/exec/obidos/ASIN/3772365590/302-7719510-8821615

Ebenfalls schnes Wochenende! :)

amerix
09-04-2005, 15:17
Bezglich der Editoren schau mal auf
http://www.htmlarea.com/

juergen
09-04-2005, 18:46
Hallo Leute,

danke fr die Info. Die haben ja die dolsten Sachen. Ich bin auch fndig geworden. Einen kleinen aber feinen Editor und das noch open Sorce.

Danke bis bald mal. Gru Jrgen

amerix
09-04-2005, 19:34
Welchen denn, wenn man fragen darf? :)

juergen
10-04-2005, 15:53
Hallo amerix,

etwa 20 habe ich mir mal gesaugt. Wenn ich alle mal gesichtet habe gebe ich mal bescheid.

Mal eine Frage an alle:

Was genau ist ein Cron Job ??

Danke und ein schnen Sonntag! Gru Jrgen

|Coding
10-04-2005, 16:01
Mit einem CronJob kannst Du zeitgesteuert ein Script o.. starten. Du knntest damit z.B. alle 24 h ein Datenbank Update durchfhren.

Kostenlose CronJob's kriegst Du auch bei uns: https://www.selfphp.org/cronjobs/index.php