Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
fgetcsv und Datum konvertieren [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
fgetcsv und Datum konvertieren


 
rodemkay
28-09-2004, 11:43 
 
Hallo,

ich habe ne csv Datei und möchte diese per PHP gerne in ein txt File konvertieren die ein anderes Format aufweist
Jetzt lese ich das Ganze mit fgetcsv ein und erhalte ein Array.

in der ersten Zeile steht die Spaltenzuordnung die soll gefiltert werden und nicht in der txt datei erscheinen.

ab zeile 2 sieht es dann folgendermassen aus

7-Sep-04,19.24,19.36,19.04
6-Sep-04,19.20,19.45,19.06
usw.

nun folgendes. das Datum soll umgewandelt werden in folgendes Format 07.09.04 mit welchem Befehl mach ich das am besten ?
Bei den Werten sollen die Punkte sollen in Kommas geändert werden.


Danke erstmal

 
wahsaga
28-09-2004, 11:47 
 
das Datum soll umgewandelt werden in folgendes Format 07.09.04 mit welchem Befehl mach ich das am besten ?
du könntest schauen, ob strtotime das format "7-Sep-04" frisst - sollte eigentlich.
dann hast du einen timestamp, und kannst den mit date() wieder wie gewünscht ausgeben lassen.

Bei den Werten sollen die Punkte sollen in Kommas geändert werden.
str_replace()

 
mrhappiness
28-09-2004, 11:49 
 
mit str_replace die punkte durch kommas ersetzen

mit str_replace die bindestriche durch punkte ersetzen

wenn das datum umbedingt zweistellig sein muss, dann:
strpos, substr, strtotime und date geschickt kombinieren (selbst denken macht klug ;))

 
rodemkay
28-09-2004, 12:01 
 
fantastisch klingt schonmal sehr gut und wie kann die erste zeile gekappt werden ?

:rocks:

 
mrhappiness
28-09-2004, 12:06 
 
indem du eine hilfsvariable benutzt, die dir die nummer des aktuell gelesenen eintrags angibt?$i = 1;
while ($data = fgetcsv() and $i++ > 1 ) {
dein code
}

 
rodemkay
28-09-2004, 12:30 
 
also strtotime funktioniert schonmal nur das ich ne fehlermeldung bekomme

$datum = strtotime("$zeile[0]") ;
$datum1 = date("d.m.y",$datum) ;

echo "$datum1";

er gibt also das richtige datum aus aber hier die fehlermeldung

Warning: date() [function.date]: Windows does not support dates prior to midnight (00:00:00), January 1, 1970 in C:\Apache\apachefriends\xampp\htdocs\00BF43FD.php on line 11

Zeile 11 ist $datum1 ....

das mit der variable funktioniert nicht, da er dann nichts ausgibt, da i=1 ist und er erst bei i>1 anfängt. Die while schleife wird aber dann nicht nochmal durchlaufen.

 
wahsaga
28-09-2004, 12:44 
 
Original geschrieben von rodemkay
Warning: date() [function.date]: Windows does not support dates prior to midnight (00:00:00), January 1, 1970
dürfte daran liegen, dass strtotime -1 zurückgegeben hat, also wohl doch nicht so wie gewünscht funktioniert an der stelle (oder $zeile[0] enthält nicht das erwartete)

 
rodemkay
28-09-2004, 12:51 
 
hm das wird wohl an der ersten zeile liegen, die ich ja sowieso nicht ausgeben wollte.

gibt es denn keine möglichkeit den filepointer beim fopen auf die 2. zeile zu setzen ?

 
wahsaga
28-09-2004, 12:56 
 
Original geschrieben von rodemkay
gibt es denn keine möglichkeit den filepointer beim fopen auf die 2. zeile zu setzen ?
warum "überliest" du die erste zeile denn nicht einfach?

wie das beispielsweise gehen könnte, hat dir doch mrhappiness schon gesagt ...

 
rodemkay
29-09-2004, 06:42 
 
Original geschrieben von rodemkay
.....

das mit der variable funktioniert nicht, da er dann nichts ausgibt, da i=1 ist und er erst bei i>1 anfängt. Die while schleife wird aber dann nicht nochmal durchlaufen.

weil es leider nicht funktioniert ich habe allerdings noch keine möglichkeit gefunden per z.b. filepointer die 1. zeile zu überspringen

Edit: lese jetzt mit fgets die erste zeile ein so das der filepointer auf der 2 zeile steht, erst dann kommt die schleife. *freu*

jetzt das nächste problem die letzte zeile soll gelöscht werden, wie ich den zeiger auf die letzte zeile setze weiss ich mit a+ aber wie ich dann eine zeile zurück gehe weiss ich nicht .

 
asp2php
29-09-2004, 08:34 
 
Hm... warum nicht einfach mit file in ein Array einlesen, dann kannst du nach Lust und Laune navigieren

 
rodemkay
29-09-2004, 08:36 
 
nunja weil es mit fgetcsv so praktisch ist eine csv einzulesen, bei file müsste ich die zeilen dann wieder mühsam auseinander klamüsern.

:rolleyes:

aber ich weiss wie ich es jetzt mache mit file die anzahl der zeilen lesen und dann mit fgetcsv kombinieren

danke

 
asp2php
29-09-2004, 08:41 
 
du kannst mit explode genauso gut, Komma separierte Strings in Array umwandeln und wie gewohnt weiter machen ;)

 
mrhappiness
29-09-2004, 08:42 
 
wenn du's schon gelesen hast mit file, dann mach doch$inhalt = file('dateiname');
foreach ($inhalt as $zeilen => $werte)
$inhalt[$zeilen] = explode(',', $werte);
$zeilen++;
echo 'Anzahl Zeilen: '.$zeilen;so sparst du dir das doppelte einlesen

 
rodemkay
29-09-2004, 10:27 
 
hm habe es erstmal so gemacht das ich eben einmal mit file zähle und fgetcsv werte einlese. ist zwar doppelt gemoppelt, aber so verstehe ich das script. ich denke wenn ich damit fertig bin kann ich zwecks vereinfachung damit beginnen. aber bin halt anfänger und momentan möchte ich nichts einbauen, was ich nicht selber kapiert habe.

trotzdem danke schonmal ihr habt mir sehr geholfen. werde mich sowieso noch öfter melden müssen. :)

 
rodemkay
30-09-2004, 11:04 
 
nächstes Problem :-)

habe folgenden code der ne datums angabe ala 30-Sep-04

$datum = strtotime("$zeile[0]") ;
$datum1 = date("d.m.y", $datum) ;

in 30.09.04 umwandeln soll beim abarbeiten klappt es zwar und er liefert mir das gewünscht ergebnis nur leider erscheint folgende fehlermeldung

Windows does not support dates prior to midnight

was ist da los ?

 
wahsaga
30-09-2004, 11:07 
 
Original geschrieben von rodemkay
Windows does not support dates prior to midnight

was ist da los ?
das hatten wir doch schon!

siehe mein posting in diesem thread vom 28-09-2004, 12:44.

 
asp2php
30-09-2004, 11:08 
 
mach echo $datum; dann weisst du's

 
rodemkay
30-09-2004, 11:39 
 
also echo $datum liefert 1096408800
und echo $datum1 29.09.04

sollte doch eigentlich so richtig sein

EDIT: also er meckert über die zeile mit datum1

 
wahsaga
30-09-2004, 11:47 
 
gehe ich recht in der annahme, dass es keine medung gibt, wenn du den wert direkt einsetzt,
$datum = strtotime("30-Sep-04") ;
$datum1 = date("d.m.y", $datum) ;
?

dann ist es vermutlich immer noch der fall, dass du diese funktionalität irgendwann mal mit einem ungültigen wert aufrufst - hast du das ganze immer noch in einer schleife stehen?

dann lass dir doch den übergebenen wert mal zur kontrolle mit ausgeben,
$datum = strtotime("$zeile[0]") ;
echo '#'.$zeile[0].'#<br>';
$datum1 = date("d.m.y", $datum) ;

 
asp2php
30-09-2004, 11:47 
 
kann es sein, dass du um eine Zeile oder so verpasst hast, denn du sprichst urprünglich von 30-Sep-04, und nun ... :rolleyes:

 
rodemkay
30-09-2004, 11:51 
 
ich hoffe ich strapaziere euch nicht zu sehr (habe schon ein schlechtes gewissen)

eigentlich hat das ganze schon nix mehr mit dem eigentlichen topic zu tun ist aber immernoch dasselbe script schreibe es deshalb in diesem thread fort ich hoffe das ist ok.

also mein script liest aus einer textdatei gewisse werte aus und verarbeitet sie weiter. mit den informationen werden daten von einer url abgerufen. leider kommt es manchmal vor, das die angeforderte url nicht erreichbar ist, nun möchte ich das er automatisch überprüft ob die daten in eine weitere textdatei geschrieben wurden, wenn nicht soll er es später nochmal versuchen. bekomme dazu folgende fehlermeldung

Warning: fopen() [function.fopen]: HTTP request failed! HTTP/1.1 404 Not Found in C:\Apache\apachefriends\xampp\htdocs\test1.php on line 17

Warning: fopen(http://www.url.de/table.csv?a=8&b=27&c=2004&d=8&e=30&f=2004&s=Daimler.DE&y=0&g=d&ignore=.csv) [function.fopen]: failed to open stream: No such file or directory in C:\Apache\apachefriends\xampp\htdocs\test1.php on line 17

Warning: fgets(): supplied argument is not a valid stream resource in C:\Apache\apachefriends\xampp\htdocs\test1.php on line 18



habe derzeit eine schleife von 30 url aufrufen und dabei kommt das maximal 1mal pro Durchlauf vor, beim nächsten durchlauf betrifft es einen anderen wert, also liegt es nicht an den werten sondern an der inet präsenzedited by asp2php. Warum haust du Fehlermeldungen in PHP-Tag rein?

 
asp2php
30-09-2004, 11:58 
 
Original geschrieben von rodemkay
Warning: fopen() [function.fopen]: HTTP request failed! HTTP/1.1 404 Not Found in C:\Apache\apachefriends\xampp\htdocs\test1.php on line 17

Warning: fopen(http://www.url.de/table.csv?a=8&b=27&c=2004&d=8&e=30&f=2004&s=Daimler.DE&y=0&g=d&ignore=.csv) [function.fopen]: failed to open stream: No such file or directory in C:\Apache\apachefriends\xampp\htdocs\test1.php on line 17

liest du die Fehlermeldung nicht :confused:

 
rodemkay
30-09-2004, 11:59 
 
Original geschrieben von wahsaga
gehe ich recht in der annahme, dass es keine medung gibt, wenn du den wert direkt einsetzt,....
dann lass dir doch den übergebenen wert mal zur kontrolle mit ausgeben,
$datum = strtotime("$zeile[0]") ;
echo '#'.$zeile[0].'#<br>';
$datum1 = date("d.m.y", $datum) ;

ja läuft über eine while schleife

habe ich gemacht und den fehler gefunden

#29-Sep-04#
#28-Sep-04#
#27-Sep-04#
##

ist die ausgabe die letzte zeile der datei enthält kein gültiges datum daher also. wie entferne ich das ganze ?

 
rodemkay
30-09-2004, 12:01 
 
Original geschrieben von asp2php
liest du die Fehlermeldung nicht :confused:

doch ich lese sie die datei wird on the fly generiert und normalerweise funktioniert das auch nur eben in 1 von 60 abrufen gibt es das problem, d.h. beim nächsten abruf funktioniert es z.b. wieder. nun möchte ich aber das er bei diesem fehler einen neuen versuch startet solange bis es funktioniert. wie gesagt der fehler kommt nur selten vor .

ich habe es in php tag gepackt, damit es übersichtlicher und besser zu lesen ist.

 
asp2php
30-09-2004, 12:03 
 
Original geschrieben von rodemkay
wie entferne ich das ganze ?
du meinst überspringen? mach 'ne Überprüfung mit if.

 
asp2php
30-09-2004, 12:11 
 
Original geschrieben von rodemkay
doch ich lese sie die datei wird on the fly generiert und normalerweise funktioniert das auch nur eben in 1 von 60 abrufen gibt es das problem, d.h. beim nächsten abruf funktioniert es z.b. wieder. nun möchte ich aber das er bei diesem fehler einen neuen versuch startet solange bis es funktioniert. wie gesagt der fehler kommt nur selten vor .

Bedeutet das, dass die Dateien auf dem anderen Server, während du liest,automatisch erzeugt wird, und wenn du Pech hast, liest du in dem Moment ein, wo die Datei nicht existiert? Nun willst du dein Script an der Stelle immer weiter versuchen lassen, bis die Datei eingelesen wird? Wenn ja hast du 2 Möglichkeiten:
1. per while versuchen, solange zu öffen, bis es klappt -> nicht ratsam, weil es schnell zu einer Endlosschleife entartet.
2. per for mit einer gewissen Anzahl der Versuche, wenn danach immer nicht klappt, Datei überspringen, weiter machen.
In beiden Fällen musst du den Fehler von fopen manuell abfangen.

 
rodemkay
30-09-2004, 12:20 
 
ja ganz genau so die werden erst generiert und ich denke das das script dann vielleicht zu schnell ist um die daten zu empfangen.

wie kann ich überprüfen ob die datei geöffnet werden konnte (also per script) ?

 
wahsaga
30-09-2004, 12:20 
 
Original geschrieben von rodemkay
ist die ausgabe die letzte zeile der datei enthält kein gültiges datum daher also. wie entferne ich das ganze ?
du hast den thread (u.a.) mit der frage eröffnet, wie du die erste zeile von der auswertung ausnimmst - da ist das doch wohl ein ziemlich ähnlich gelagertes problem, über das du jetzt erst mal selber ein wenig nachdenken könntest, bevor du uns dein komplettes script erstellen lässt, meinst du nicht ...?


(zugeben, es ist etwas komplizierter als bei der ersten zeile, da du die gesamte zeilenanzahl wissen musst. aber wie gesagt, ein bisschen selber denken und eine problemlösung suchen, könnte jetzt langsam echt mal nicht schaden ...)



wie kann ich überprüfen ob die datei geöffnet werden konnte (also per script) ?
fopen() hat auch einen rückgabewert - schau dir mal die beschreibung im manual an.

 
rodemkay
30-09-2004, 12:46 
 
ich mach mir ja meine eigenen gedanken, ich stele ja nur die fälle ein die ich selbst nicht gelöst bekomme

das ist das was ich in meinem script hatte, nur leider funzt es nicht

$count = file($statistik);
foreach ($count as $value) {}
$count1 = count($count)-2;
$co=0;
echo $count1.$count;

$statistik ist die datei die geöffnet wird.

$count 1 gibt mir die anzahl aus, -2 deshalb weil die erste und letzte zeile weg soll. die erste wird übersprungen und ab da eben die restlichen zeilen aber irgendwie gibt $count mir nur Array1 wider.

 
asp2php
30-09-2004, 12:59 
 
Oh mann, ich habe dir doch den Link über file:readthis: gegeben, wenn du gelesen hast, dann darfst du solche Fragen nicht stellen :teach:. OK, lese nochmals und frage dir mal selbst: was liefert file zurück?

BTW: andererseits, wenn du schon foreach ($count as $value) machst, dann mußt du doch wissen was $count ist :rolleyes:


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:30 Uhr.