2015-04-02 69 views
-1

這是我擁有的文本文件中的數據。爲什麼將文本文件保存到數據庫會導致重複?

[Start] 
"Pepsi"|"30"|"64" 
"Coke"|"35"|"24" 
"Sandwich"|"60"|"14" 
"Chicken"|"120"|"10" 
"Bread"|"60"|"24" 
[End] 

enter image description here

var files = from file in Directory.EnumerateFiles(@"C:\Users\K\Desktop\New folder", "*.txt", SearchOption.AllDirectories) 
      from line in File.ReadLines(file) 
      select new 
      { 
       File = file, 
       Line = line 
      }; 
using (MySqlConnection con = new MySqlConnection(@"server=localhost;database=test;uid=root;pwd=pw;")) 
{ 
con.Open(); 
foreach (var f in files) 
    { 
    Console.WriteLine("{0}\t{1}", f.File, f.Line); 
    string[] Lines = File.ReadAllLines(f.File); 
    bool processRecord = false; 

     foreach (string line in Lines) 
     { 
      if (!processRecord) 
      { 
       if (Lines.Contains("[Start]")) 
       { 
        processRecord = true; 
        continue; 
       } 
       if (Lines.Contains("[End]")) 
       { 
        processRecord = false; 
        continue; 
       } 
      } 

      if (processRecord) 
      { 
       string[] readLineSplit = line.Split('|'); 

       if (readLineSplit.Length > 1) 
       { 
        MySqlCommand cmd = new MySqlCommand("INSERT INTO Products(Product_Name, Product_Price, QTY) VALUES (@Product_Name, @Product_Price, @QTY)", con); 
        cmd.Parameters.AddWithValue("@Product_Name", readLineSplit[0].Trim('\"')); 
        cmd.Parameters.AddWithValue("@Product_Price", readLineSplit[1].Trim('\"')); 
        cmd.Parameters.AddWithValue("@QTY", readLineSplit[2].Trim('\"')); 
        cmd.ExecuteNonQuery(); 
       } 
      } 
     } 
     } 
    } 

這是代碼我到目前爲止,我不知道這部分代碼是造成多條記錄,是什麼問題?我需要任何幫助,謝謝。

+0

是的,我甚至放棄了表,然後重新運行程序。 – 2015-04-02 08:52:59

+0

_ [我如何問一個好問題?](http://stackoverflow.com/help/how-to-ask)_, – MickyD 2015-04-09 03:16:00

+0

我已經將您的標題重寫爲_question_而不是_observation_。順便歡迎來到SO! – MickyD 2015-04-09 03:18:04

回答

0
var files = from file in Directory.EnumerateFiles(@"C:\Users\K\Desktop\New folder", "*.txt", SearchOption.AllDirectories) 
          from line in File.ReadLines(file) 
          select new 
          { 
           File = file, 
           Line = line 
          }; 

這是爲文件中的每一行生成一個條目。像:

foo.txt | text here,text here, text here. 
foo.txt | text here, text here, text here. 
etc.. 

然後你循環這些和每一行你通過閱讀所有的行再次處理整個文件。這當然會導致重複。嘗試改變第一行

var files = from file in Directory.EnumerateFiles(@"C:\Users\K\Desktop\New folder", "*.txt", SearchOption.AllDirectories) select new { File = file }; 
+0

我試過了,仍然得到重複文件 'code' var files = from Directory.EnumerateFiles(@「C:\ Users \ Kevin \ Desktop \ New folder」,「* .txt」,SearchOption.AllDirectories)中的文件from from在File.ReadLines(文件)行 選擇新的 {File = file};'代碼' – 2015-04-02 09:11:35

+0

刪除「從File.Readlines(文件)中的行」部分。 – 2015-04-02 09:38:20

+0

它的工作原理。謝謝。 – 2015-04-02 09:41:44

0

爲什麼在循環中再次讀取所有文件的所有行?你已經將它們讀入files。所以內部循環是多餘的。

而不是...

foreach (var f in files) 
{ 
    string[] Lines = File.ReadAllLines(f.File); 
    bool processRecord = false; 
    foreach (string line in Lines) 
    { .... 

你有匿名類型的線路:

foreach (var f in files) 
{ 
    string line = f.Line; 
    // ... 

這可能會導致你的重複?

+0

我刪除了字符串[] Lines = File.ReadAllLines(f.File);並用字符串Lines = f.Line替換它;那麼即時獲取不能轉換類型字符爲字符串上的foreach(字符串行在線) – 2015-04-02 09:13:40

+0

@KevinRodriguez:正如我所說,你不需要內循環,因爲你已經(單)線。 – 2015-04-02 09:16:42

相關問題