2016-06-02 12 views
1

Ich versuche, eine einfache und tägliche Aufgabe zu automatisieren: Es gibt mehrere .csv-Dateien auf einem SFTP-Server, die ich in einer MySQL-Datenbank importieren möchte.Tägliche Import CSV-Dateien von SFTP zu einer MySQL-Datenbank

Die Dateinamen haben eine Struktur wie 20160601-1.csv, 20160601-2.csv, 20160601-3.csv, etc. Die Anzahl der Dateien Taucher von 8 bis 20 pro Tag. Das Layout der .csv ist immer gleich (10 Spalten mit einigen leeren Feldern).

Ich weiß, das ist nicht sehr detailliert, aber ich suche jetzt einige Stunden und ich weiß nicht, wo ich anfangen soll.

Ich denke, PHP ist ein guter Weg, dies zu tun? Oder vielleicht Python?

+2

Die Sprache zu lesen hier keine Rolle. Sie können das wahrscheinlich in jedem von ihnen erreichen. Müssen Sie diese Dateien verarbeiten, bevor Sie die Daten in die DB übertragen oder können Sie einfach 'LOAD DATA INFILE ...' in MySQL verwenden? Wenn ja, können Sie das wahrscheinlich im einfachen Bash-Skript tun. –

+2

@dragoste: Wenn ich es von einer Shell aus mache, würde ich das Dienstprogramm mysqlimport über 'LOAD DATA' bevorzugen. Aber ansonsten stimme ich allem zu, was Sie gerade gesagt haben. – eggyal

+0

@dragoste Es ist eine Tab-getrennte Datei und ich muss die ersten 5 Zeilen ignorieren. Meine Erfahrung mit Tab-getrennten Dateien ist, dass leere Felder manchmal Probleme mit LOAD DATA und LOAD DATA INFILE verursachen (wegen Trailing denke ich?), Also ersetze ich alle Tabs (/ t) durch Komma und importiere das CSV nach MySQL. Aber wenn es eine Option zum direkten Importieren gibt, wäre das großartig! – Glarp

Antwort

1

Sie können dies in PHP tun Code fgetcsv() Funktion,

Beispiel CSV-Datei hat

 



    //read file 
     $fp = fopen($filename,'r') or die("can't open file"); 
     $csv_line=fgetcsv($fp); 
     $last=0; 

     $insert_count=0; 
     while($csv_line = fgetcsv($fp,1024)) 
     { 
      //$csv_line is an indexed array for values on each line 
      //database update code goes here 
     } 

+0

Es lohnt sich zu beachten, dass es separate Abfrage für jede Zeile ausführen wird. Für große Dateien, deren Verarbeitung lange dauern wird. Es kann besser sein, Batch-Einsätze, z.B. alle 100 oder 1000 Zeilen. –

+1

Sie können mehrere Zeilen in eine einzelne Abfrage einfügen wie 'INSERT INTO tbl_name (a, b, c) WERTE (1,2,3), (4,5,6), (7,8,9);' – Pankaj

+0

Ja Das ist genau das, was ich meinte. –