Seite 1 von 1

.csv Datei hochladen und prüfen

Verfasst: 22.01.2004 15:40
von Tekknotrip
Hallo,
will den User die Möglichkeit geben, eine .csv Datei hochzuladen, diese Datei wird dann in eine MySQL geschrieben. Bevor sie aber geschrieben wird, sollte sie auf Richtigkeit geprüft werden.

Wie kann ich da vorgehen?

Beispieldatensatz:

Code: Alles auswählen

  7.01.2004;  16:45;3,7;90;OK;23,1;42;OK;0;6;OK;0;220;0;OK;1006;OK;0,284;OK; 0:00 ;8;OK
 7.01.2004;  17:00;3,4;90;OK;24;41;OK;0;6;OK;0;220;0;OK;1006;OK;0,047;OK; 0:00 ;8;OK
 7.01.2004;  17:15;3,4;92;OK;24,3;40;OK;0;6;OK;0;60;0;OK;1006;OK;0;OK; 0:00 ;8;OK
 7.01.2004;  17:30;3,4;92;OK;24;39;OK;0;6;OK;0;50;0;OK;1006;OK;0;OK; 0:00 ;8;OK
 7.01.2004;  17:45;3,1;92;OK;24;39;OK;0;6;OK;0;50;0;OK;1006;OK;0;OK; 0:00 ;8;OK
 7.01.2004;  18:00;2,9;93;OK;24,1;39;OK;0;6;OK;0;50;0;OK;1006;OK;0;OK; 0:00 ;8;OK
 7.01.2004;  18:15;2,8;94;OK;24,6;39;OK;0;6;OK;0;50;0;OK;1005;OK;0;OK; 0:00 ;8;OK
 7.01.2004;  18:30;2,8;94;OK;24,7;39;OK;0;6;OK;0;60;0;OK;1006;OK;0;OK; 0:00 ;8;OK
 7.01.2004;  18:45;2,7;94;OK;24,8;39;OK;0;6;OK;0;25;0;OK;1005;OK;0;OK; 0:00 ;8;OK
 7.01.2004;  19:00;2,9;94;OK;24,7;37;OK;0;6;OK;0;30;0;OK;1005;OK;0;OK; 0:00 ;8;OK
 7.01.2004;  19:15;3;94;OK;24,9;37;OK;0;6;OK;0;65;0;OK;1005;OK;0;OK; 0:00 ;8;OK
 7.01.2004;  19:30;3,1;94;OK;24,9;36;OK;0;6;OK;0;80;0;OK;1005;OK;0;OK; 0:00 ;8;OK
 7.01.2004;  19:45;3,1;94;OK;24,8;36;OK;0;6;OK;0;75;0;OK;1005;OK;0;OK; 0:00 ;8;OK
 7.01.2004;  20:00;3,1;94;OK;24,9;36;OK;0;6;OK;0;70;0;OK;1005;OK;0;OK; 0:00 ;8;OK
 7.01.2004;  20:15;3,2;93;OK;24,8;36;OK;0;6;OK;0;60;0;OK;1005;OK;0;OK; 0:00 ;8;OK
 7.01.2004;  20:30;3,2;93;OK;24,8;36;OK;0;6;OK;0;60;0;OK;1005;OK;0;OK; 0:00 ;8;OK
 7.01.2004;  20:45;3,1;93;OK;24,8;36;OK;0;6;OK;0;60;0;OK;1005;OK;0;OK; 0:00 ;8;OK
Das was der User hochlädt und evtl. abweicht, soll nicht in die DB geschrieben werden.

Danke für Hinweise

Verfasst: 22.01.2004 23:24
von Pyramide
Du teilst die Daten ja sicher während des Importvorgangs entsprechend auf, dann brauchst du die Teildaten nur noch mit [php:is_int], [php:strtotime] etc. zu prüfen

Verfasst: 23.01.2004 13:31
von Tekknotrip
Kannst du mir da vielleicht helfen?

mit

Code: Alles auswählen

$teilarray1 = array_slice($pruefmuster,0,1);
kann zwar das array aufsplitten, aber eben nur bis zum angegeben Wert 1

Alles was danach kommt, wird nicht mehr erfasst.

Ich möchte aber gerne das array folgendermaßen aufsplitten:

- Alle Datumswerte (in ein Array)
- Alle Zeitwerte (in ein Array)

usw..., damit ich alle Arrays auf den gültigen Wert prüfen kann.

Also if array1 = datumswert, dann ok
if array2 = zeitwert, dann ok
if array3 = numerischer wert, dann ok

usw...

Ich hänge da ein wenig in der Luft, da ich eine Fileprüfung das erste mal mache.

Danke, Gruss, Micha[/code]

Verfasst: 23.01.2004 14:07
von itst
Um zu wissen, ob ein Wert ein Zeitwert ist, musst Du ihn prüfen. Prüfen kannst Du ihn aber nur, wenn Du weisst, was für ein Wert er ist. Problem erkannt?

Du wirst das fest verdrahten müssen, sprich jede Zeile per [php:explode] aufdröseln und festlegen, auf was $zeile[0], $zeile[1] usw. getestet werden sollen.

Verfasst: 23.01.2004 21:36
von Pyramide
Hier mal Beispielcode:

Code: Alles auswählen

$zeilen = file('foo.txt');
foreach($zeilen as $zeile) {
   $daten = explode(';', $zeile);
   $daten = array_map('trim', $daten);
   $list($tag, $monat, $jahr) = explode('.', $daten[0]);
   $list($stunden, $minuten) = explode(':', $daten[1]);
   $datum = strtotime("$jahr-$monat-$jahr $stunden:$minuten");
   if(!$datum) {
      die('Falsche Daten, Spalte 1+2 kein Datum/Uhrzeit');
   }
   $eine_zahl = $daten[3];
   if(!is_int($eine_zahl)) {
      die('Falsche Daten, Spalte 4 keine Zahl');
   }
}

Verfasst: 24.01.2004 17:18
von Tekknotrip
Hallo Leute, DANKE, das sollte mir vorerst mal weiterhelfen.

Das Problem wird letztenendes sein, dass der Server eine zu hohe Last fahren wird (solche .csv. Dateien haben ca. 1 MB, also knapp 11.000 Felder).

Vielleicht mache ich es noch ein wenig anders. Ich schreibe das File in eine Ausweichtabelle, fahr dann über die Tabelle drüber und wenn diese nicht i.O., dann wird sie gelöscht, andernfalls wird sie in die richtige DB geschrieben.

Oder denkt ihr, dass das auch eine zu hohe Performancelast ist, so dass ich mich da im Kreise drehe?

Achso, das soll dann mal daraus werden:
http://www.wetterforum.com/viewtopic.php?p=439

Die daten lade ich derzeit noch mit phpmyadmin hoch, soll dann aber nacher für jeden User zugänglich sein, der sich über das Board registriert hat. Die png´s werden dann im Userprofil angezeigt.
Die Daten kommen aus einer Wetterstation.

Gruss, Micha

Verfasst: 24.01.2004 17:36
von itst
Wenn Du das über die Tabelle lösen willst, machs mit einer Heap-Tabelle.

Verfasst: 28.01.2004 20:58
von Tekknotrip
Hi, sodele, bin nun mal soweit "FAST" fertig,
wenns nur nicht immer an den kleinigkeiten liegen würde :-)

Ich lade das File hoch: STATUS OK
Ich prüfe das File: STATUS OK
Ich öffne die DB und schaue, ob schon was drinnsteht: STATUS OK
Wenn nicht, dann mache ein INSERT des Files in die DB: STATUS OK
Wenn etwas drinnsteht, dann mach ein UPDATE der DB: ERROR

Das Problem:
in dem File sind keine id´s und auch keine User_id vergeben.
D.h. ich mache die User_id nachträglich rein (per hidden beim File Upload).
Die id mache ich per auto_increment.

Das Problem:

Code: Alles auswählen

$result = mysql_query("SELECT * FROM .......");
		       while($row = mysql_fetch_array($result)){
                       $id2[] = $row["id"];
                       $id3 = implode(" ", $id2); 
            }
Damit zerhacke ich das Array, damit ich es später nutzen kann. Das Array beinhaltet die id´s, wenn schon ein Datensatz vorhanden ist.

Später dann, nach der Prüfung, ob schon was drinsteht, dann das Update:

Code: Alles auswählen

if ($num_rows != 0)
			{	
				
				mysql_query("UPDATE ......... SET
							luftdruck='$luftdruck', helligkeit='$helligkeit',
							regen='$regen', wind='$wind', windrichtung='$windrichtung',
							aussentemp='$temp', aussenfeuchte='$aussenfeuchte',
							sonnenschein='$sonnenschein', datum='$datum1',
							uhrzeit='$uhrzeit' WHERE id='$id3'")
							or die (mysql_error());
				}
So, das Problem dabei ist, dass er id jeweils immer nur die 1 hat und nicht das gesamte implode. Weiss der Geier warum.

Andernfalls habe ich ein Problem, wenn ich WHERE user_id='$user_id mache (user_id wird ja mit übergeben und ist immer gleich). Dann schreibt er mir alles doppelt und dreifach in die DB mit jeweils den gleichen Werten (in einer Schleife).

Wie würdest du das lösen?

Ich habe damit ein Problem, da ich sonst immer mit Arrays in Schleifen arbeite, aber diesmal das Array ausserhalb ist :cookie:

Wäre für nochmalige Hilfe dankbar!
Gruss, Micha