.csv Datei hochladen und prüfen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Tekknotrip
Mitglied
Beiträge: 205
Registriert: 18.03.2003 16:17
Wohnort: Esslingen
Kontaktdaten:

.csv Datei hochladen und prüfen

Beitrag 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
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag 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
Tekknotrip
Mitglied
Beiträge: 205
Registriert: 18.03.2003 16:17
Wohnort: Esslingen
Kontaktdaten:

Beitrag 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]
Benutzeravatar
itst
Ehrenadmin
Beiträge: 7418
Registriert: 21.08.2001 02:00
Wohnort: Büttelborn bei Darmstadt
Kontaktdaten:

Beitrag 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.
Sascha A. Carlin,
phpBB.de Ehrenadministrator
:o
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag 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');
   }
}
Tekknotrip
Mitglied
Beiträge: 205
Registriert: 18.03.2003 16:17
Wohnort: Esslingen
Kontaktdaten:

Beitrag 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
Benutzeravatar
itst
Ehrenadmin
Beiträge: 7418
Registriert: 21.08.2001 02:00
Wohnort: Büttelborn bei Darmstadt
Kontaktdaten:

Beitrag von itst »

Wenn Du das über die Tabelle lösen willst, machs mit einer Heap-Tabelle.
Sascha A. Carlin,
phpBB.de Ehrenadministrator
:o
Tekknotrip
Mitglied
Beiträge: 205
Registriert: 18.03.2003 16:17
Wohnort: Esslingen
Kontaktdaten:

Beitrag 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
Antworten

Zurück zu „Coding & Technik“