2016-05-11 3 views
0

Ich benutze C#, um alle CSV-Dateien in einem Verzeichnis zu analysieren und fügen Sie jede Datei in separaten MYSQL-Tabellen. Parsing jeden Dateinamens funktioniert, aber ich habe ein Problem mit der Einfügung.CSV-Datei einfügen in MYSQL-Tabellen mit C#

Alle CSV-Dateien haben das gleiche Format:

Name,Mike,John,Parker,Joanne,Claire 
4/26/2012 12:20,88.1,98.2,87.4,92.5,78.2 
5/16/2012 11:20,78.1,78.2,76.4,86.5,97.2 
.... 
.... 

Grade12 Tabelle:

Id StudentName Score DateTimeId 

für Datum und Uhrzeit Tabelle:

Id DateTime 

Wenn ich die CSV-Datei importieren und einfügen in grade12 Tabelle, ich möchte das Ergebnis wie sein:

Id StudentName Score DateTimeId 
1  Mike  88.1  1 
2  John  98.2  1 
3  Parker  87.4  1 
4  Joanne  92.5  1 
5  Claire  78.2  1 
6  Mike  78.1  2 
7  John  78.2  2 
8  Parker  76.4  2 
9  Joanne  86.5  2 
10  Claire  97.2  2 
.... 
.... 

und für den Datetime-Tabelle:

Id DateTime 
1  2012-04-26 12:20:00 
2  2012-05-16 11:20:00 
.... 
.... 

so weit ich

  1. versucht haben, lesen Sie die erste Zeile der CSV (entfernen Sie das erste Element "Name") und Einfügen in student Säule.
  2. lesen Sie die zweite Zeile von csv (entfernen Sie das erste Element "DateTime Daten ex: 4/26/2012") und fügen Sie in Score-Spalte ein.
  3. Ich soll DateTime Daten jeder Zeile verwenden und in datetime Tabelle und grade12 Tabelle Fremdschlüssel dazu einfügen, aber ehrlich gesagt bin ich ziemlich verloren.

mein C# -Code:

public void process(string csvFile, string grade) 
    { 
     using (MySqlCommand insertCommand = connection.CreateCommand()) 
     { 
      insertCommand.CommandText = 
       @"INSERT INTO " + grade + "(StudentName, Score, DateTimeId) VALUES (@StudentName, @Score, @DateTimeId)"; 

      insertCommand.Parameters.Add(new MySqlParameter("@StudentName", "STRING")); 
      insertCommand.Parameters.Add(new MySqlParameter("@Score", "DECIMAL")); 
      insertCommand.Parameters.Add(new MySqlParameter("@DateTimeId", "INT32")); 

      string[] lines = System.IO.File.ReadAllLines(csvFile); 

      foreach (string line in lines) 
      { 
       string trimedLine = line.Trim(); 

       if (line.StartsWith("Name")) 
       { 
        studentNames = trimedLine.Split(new[] { ',' }).Skip(1).ToArray(); 
        continue; 
       }      
        eachRow = trimedLine.Split(new[] { ',' }).Skip(1).ToArray(); 

       for (int i = 0; i < studentNames.Length; i++) 
       { 
        MySqlParameter param = insertCommand.Parameters[0]; 
        param.Value = studentNames[i]; 
       } 

       for (int i = 0; i < eachRow.Length; i++) 
       { 
        MySqlParameter param = insertCommand.Parameters[1]; 
        param.Value = eachRow[i]; 
       } 

       //I am not sure about this part. This is random data for testing purpose. 
       int[] datetime = { 1, 2, 3, 4, 5, 6, 7, 8 }; 
       for (int i = 0; i < datetime.Length; i++) 
       { 
        MySqlParameter param = insertCommand.Parameters[2]; 
        param.Value = datetime[i]; 
       } 
       insertCommand.ExecuteNonQuery(); 
      }     
     } 

verbrachte ziemlich viel Zeit, sondern wandert immer noch rund. Daten gehen in die Tabelle, aber sie sehen nicht gut aus. Jede Hilfe wird geschätzt.

+0

Diese Schleife ist falsch: Für (int i = 0; i CooncilWorker

Antwort

1

Ich habe Angst, ich habe keine Zeit, um konkrete Code-Beispiele zu schreiben, aber meine persönliche Vorgehensweise wäre, das Verfahren in zwei Teile zu teilen.

Der erste Teil analysiert die CSV-Dateien und legt deren Inhalt in Klassen und Listen dieser Klassen, um die Daten in einem Format zu erhalten, das iteriert werden kann. Dadurch können Sie in späteren Schritten ein solides Datenmodell verwenden, anstatt die SQL-Abfrage beim Parsen von Daten live erstellen zu müssen. Dies hilft auch sicherzustellen, dass die CSV in einem korrekten Format ist.

Der zweite Teil wird danach ausgeführt und verwendet die zuvor erstellten Objekte zum Erstellen und Ausführen der SQL-Abfragen. Da Sie die Daten aus der CSV bereits in einem flexibleren Format analysiert haben, sollte dies viel einfacher sein.