2016-05-09 2 views
0

J'essaye d'analyser les fichiers dans le répertoire/insérer dans la base de données mysql basé sur ce post et à peu près cela fonctionne, sauf que les valeurs de csv pour chaque colonne sont arrondies et deviennent des valeurs INT dans la base de données. Je suppose que j'ai besoin de changer DECIMAL pour quelque chose d'autre, mais je ne pouvais pas le comprendre.rechercher fichier csv dans un dossier et insérer dans la base de données mysql

(Ex: 1.11 devient 1, 45,5 devient 46)

fichier csv:

test1,test2,test3,test4 
1.11,1.23,67.4,4.5 
1.12,5.42,45.5,6.45 

mon code:

public void sqlTest() 
    { 
     string connectionString = "server=localhost;database=test;UserId=root;password=test;"; 
     using (MySqlConnection connection = new MySqlConnection(connectionString)) 
     { 
      connection.Open(); 
      using (MySqlCommand cmd = connection.CreateCommand()) 
      { 
       cmd.CommandText = @"DROP TABLE test IF EXISTS"; 
       cmd.CommandText = @"CREATE TABLE test ( 
             Id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
             test1 DECIMAL, 
             test2 DECIMAL, 
             test3 DECIMAL, 
             test4 DECIMAL 
            )"; 
       cmd.ExecuteNonQuery(); 
      } 
      connection.Close(); 
      connection.Open(); 

      using (MySqlCommand insertCommand = connection.CreateCommand()) 
      { 
       insertCommand.CommandText = 
        @"INSERT INTO test (test1, test2, test3, test4) 
         VALUES (@test1, @test2, @test3, @test4)"; 

       insertCommand.Parameters.Add(new MySqlParameter("@test1", DbType.Decimal)); 
       insertCommand.Parameters.Add(new MySqlParameter("@test2", DbType.Decimal)); 
       insertCommand.Parameters.Add(new MySqlParameter("@test3", DbType.Decimal)); 
       insertCommand.Parameters.Add(new MySqlParameter("@test4", DbType.Decimal)); 

       string[] files = Directory.GetFiles("D:/computer/csv files", "*.csv"); 

       foreach (string file in files) 
       { 
        string[] lines = System.IO.File.ReadAllLines(file); 
        bool parse = false; 

        foreach (string tmpLine in lines) 
        { 
         string line = tmpLine.Trim(); 
         if (!parse && line.StartsWith("test1")) 
         { 
          parse = true; 
          continue; 
         } 
         if (!parse || string.IsNullOrEmpty(line)) 
         { 
          continue; 
         } 

         foreach (MySqlParameter parameter in insertCommand.Parameters) 
         { 
          parameter.Value = null; 
         } 

         string[] values = line.Split(new[] { ',' }); 

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

          decimal value; 
          param.Value = decimal.TryParse(values[i], out value) ? value : 0; 

         } 
         insertCommand.ExecuteNonQuery(); 
        } 

       } 
      } 
      connection.Close(); 
     } 
    }   
} 

Toute orientation ou des conseils est appréciée!

+0

flotteur ?? réal??? – Viru

Répondre

0

Si j'étais à votre place, je voudrais d'abord changer la structure de la table à ce

CREATE TABLE `test`(
    `test1` DOUBLE(13,2), 
    `test2` DOUBLE(13,2), 
    `test3` DOUBLE(13,2), 
    `test4` DOUBLE(13,2)); 

Ensuite, au lieu de lire le contenu des fichiers et de faire un insert pour chaque enregistrement, vous pouvez utiliser LOAD DATA INFILE commande pour importer le fichier csv dans votre table dans mysql.

Cochez ce lien MySQL - LOAD DATA INFILE. pour obtenir la documentation complète. Exemple d'utilisation est comme ce

LOAD DATA INFILE 'test.csv' INTO TABLE test 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\r\n' 
IGNORE 1 LINES 

En fonction de votre environnement de serveur, vous devez modifier le chemin du fichier correctement csv et assurez-vous que le drapeau de votre mysql infile local est défini sur 1, sinon vous pouvez le régler en utilisant cette commande

mysql -u username -p --local-infile=1 

pour en revenir à votre code, il peut être réduit à ce

... 
... 
... 

public void sqlTest() 
{ 
    string connectionString = "server=localhost;database=test;UserId=root;password=test;"; 
    using (MySqlConnection connection = new MySqlConnection(connectionString)) 
    { 
     connection.Open(); 
     string query = @"DROP TABLE test IF EXISTS; 
         CREATE TABLE `test`(
         `test1` DOUBLE(13,2), 
         `test2` DOUBLE(13,2), 
         `test3` DOUBLE(13,2), 
         `test4` DOUBLE(13,2));"; 
     using (MySqlCommand cmd = new MySqlCommand(query, connection)) 
     {    
      cmd.ExecuteNonQuery(); 
      string[] files = Directory.GetFiles("D:/computer/csv files", "*.csv"); 

      foreach (string file in files) 
      { 
       query [email protected]"LOAD DATA INFILE '"+file+"' INTO TABLE test 
         FIELDS TERMINATED BY ',' 
         LINES TERMINATED BY '\r\n' 
         IGNORE 1 LINES"; 
       using (MySqlCommand cmd1 = new MySqlCommand(query, connection)) 
       { 
        cmd1.ExecuteNonQuery(); 
       }     

      } 
     } 

    } 
} 
... 
... 
... 
+0

Merci beaucoup! j'apprécie – pavilion

+0

@pavilion vous êtes les bienvenus! – indago