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
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.
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 ?
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 .
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
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 ?
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.
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
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) ;
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?
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.
Original geschrieben von rodemkay
wie entferne ich das ganze ?
du meinst überspringen? mach 'ne Überprüfung mit if.
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) ?
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.
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:
|
|