Automatisches Einlesen von CSV-Dateien

Vectormaster

Mitglied
Hallo,
Ich habe ein Verzeichnis, welches CSV- Dateien enthält, welche von einem Programm erstellt werden. Genaugenommen gibt es für jeden Tag eine neue Datei es wird also jedes mal um 00:00:00 Uhr eine neue Datei angefangen. Die Dateien heißen z.B. „2007-12-18-recdata.csv“. Diese Dateien enthalten 6 Werte: Nummer (z.B. 1), Datum (z.B. 05.04.2009), Uhrzeit (z.B. 02:00:03), Wert1 (z.B. 14,5), Wert2 (z.B. 23,65) und Wert3 (z.B. 45,34). Es wird jede Minute eine neue Zeile mit Werten eingefügt.

… soweit so gut aber nun zu meinem Problem:
Wie schaffe ich es, dass durch aufrufen eines PHP- Skriptes automatisch die Daten aus den CSV- Dateien, welche noch nicht in der Datenbank stehen (SQL, Postgres), in diese geschrieben werden.
Mein Problem liegt nun darin, dass ich nicht weis, wie ich es schaffe ein Verzeichnis immer zu durchsuchen und immer dann die Dateien, welche noch nicht in der Datenbank vorhanden sind einzulesen.

P.S.: Ich habe das ganze schon für eine Datei, welche manuell ausgewählt werden muss realisiert und es funktioniert. Mir geht es praktisch nur darum, eine Lösung zu finden, wie ich dass Verzeichnis immer Scannen kann und dann nach diesem „Scann- Vorgang“ die noch nicht eingelesenen Daten in die Datenbank schreiben kann.

Ich hoffe, Ihr versteht mein Problem.
 
Was hälst du davon die bereits eingelesenen Dateien in einen anderen Ordner zu verschieben oder sonst irgendwie durch Umbenennung zu markieren?

Wenn du die Dateien nicht ändern möchtest:
Lege dir eine Tabelle an, die dir die Dateinamen der bereits eingelesenen Dateien vorhält und vergleiche, ob die Datei bereits in dieser Tabelle steht.
==> Das geht allerdings nur, wenn sich ein Dateiname nicht wiederholen kann!
 
Hallo,
das mit der Tabelle hab ich mir auch so gedacht. Ich habe auch angefangen, ein Script zu schreiben, was den Order durchsucht. Ich bin mir jedoch noch nicht wirklich sicher, wie ich das ganze händeln will. Wahrscheinlich muss ich den gesamten Ordner durchsuchen und die ganzen Dateinamen in die Datenbank schreiben, dann in einer weiteren Spalte eine 0 für noch nicht eingelesen , eine 1 für teilweise eingelesen und eine 2 für schon vollständig eingelesen schreiben. Bei den noch nicht ganz eingelesenen, würde ich dann noch die zu letzt eingelesene Zeile eintragen, damit ich weis wo ich weitermachen muss.
Momentan habe ich folgendes Skript, welches das Verzeichnis durchsucht und die Dateinamen dann in einem Array zurück gibt. Diese Array wird dann mit „foreach“ in die Datenbank geschrieben:

PHP:
require 'include/class/SQLSERVICES.php';
require 'include/confic/database.confic.php';

$sqlservices    = new SQLSERVICES();
$sqlservices->connectsql_database('datenbank');

$import_folder    = 'csv_dateien';
$get_filenames    = scandir($import_folder);
$anzahl           = count($get_filenames);

foreach($get_filenames as $filename)
{
	$insert_filenames_sql = "INSERT INTO importfiles (filename) VALUES ('$filename')";
	$insert_filenames     = $sqlservices->sql_query($sql_query);
}

$sqlservices->closeconnect_database();

Ich hab es noch nicht getestet (werd ich morgen…) aber müsste eigentlich so funktionieren.

Gibt es vll. Verbesserungsvorschläge
 
Soweit sieht das Script erst einmal ganz gut aus. Hast du dir zu diesem Zeitpunkt aber auch schon mal überlegt, wie viele Dateien es denn werden können?
Denn aktuell werden ja immer alle Dateien, bzw. Dateinamen überprüft und das kann irgendwann doch mal relativ viel werden. Vor allem, wenn nun auch noch Dateien nur zu gewissen Teilen eingelesen werde und dann an dieser Stelle weiter gemacht werden muss. Sollten es nicht so viele Dateien werden ist das ok so, sollte es doch mehr werden würde ich mir hierüber nochmal Gedanken machen, da es schnell vorkommen wird, dass du in einen Browser-Timeout laufen wirst.

Ein Überlegungspunkt wäre ein Delta zu bilden und zunächst einmal dieses zu überprüfen.
Am einfachsten wäre allerdings nach wie vor die vollständig eingelesenen Dateien in einen anderen Ordner zu verschieben oder diese umzubenennen.
 
Zurück