2015-06-04 70 views
0

我有一個文本定界文件需要轉換爲數據表。由於文字是這樣的:如果包含雙標記,則不要拆分字符串

Name,Contact,Email,Date Of Birth,Address 
JOHN,01212121,[email protected],1/12/1987,"mawar rd, shah alam, selangor" 
JACKSON,01223323,[email protected],1/4/1967,"neelofa rd, sepang, selangor" 
DAVID,0151212,[email protected],3/5/1956,"nora danish rd, klang, selangor" 

這也是我怎麼會看在C#

DataTable table = new DataTable();     

        using (StreamReader sr = new StreamReader(path)) 
        { 
         #region Text to csv 
         while (!sr.EndOfStream) 
         { 
          string[] line = sr.ReadLine().Split(','); 
          //table.Rows.Add(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5]); 

          if (IsRowHeader)//Is user want to read first row as the header 
          { 
           foreach (string column in line) 
           { 
            table.Columns.Add(column); 
           } 

           totalColumn = line.Count(); 

           IsRowHeader = false; 
          } 
          else 
          { 
           if (totalColumn == 0) 
           { 
            totalColumn = line.Count(); 

            for (int j = 0; j < totalColumn; j++) 
            { 
             table.Columns.Add(); 
            } 

           } 

           // create a DataRow using .NewRow() 
           DataRow row = table.NewRow(); 

           // iterate over all columns to fill the row 
           for (int i = 0; i < line.Count(); i++) 
           { 
            row[i] = line[i]; 
           } 

           // add the current row to the DataTable 
           table.Rows.Add(row); 
          }   
         } 

列是動態的,用戶可以添加或刪除文本文件中的列文本文件。所以我需要檢查有多少列並設置爲數據表,之後我將讀取每行,將值設置爲數據行,然後將行添加到表。

如果我不刪除雙標記內的分號,它將顯示錯誤「找不到第5列」,因爲第一行只有4列(從0開始)。

處理文本分隔的最佳方式是什麼?

+0

您是否需要在每次確定要使用多少列後生成數據庫表? – TheBoyan

+0

@TheBojan:是的確切 – Chuki2

+0

可能的重複[如何拆分csv的列可能包含,](http://stackoverflow.com/questions/6542996/how-to-split-csv-whose-columns-may-contain) –

回答

3

不要試圖重新發明CSV解析輪。使用.NET中內置的解析器:Microsoft.VisualBasic.FileIO.TextFieldParser

請參閱https://stackoverflow.com/a/3508572/7122

+0

這是爲什麼被低估?對我來說似乎是一個非常好的答案。 +1 – amcdermott

+0

@amcdermott。我認爲這是因爲我誤解了這個問題而被低估了,但我認爲我沒有。 –

+0

問題解決了,感謝您的解決方案.. +1 – Chuki2

-1

我通常像這樣的東西去:

const char separator = ','; 
using (var reader = new StreamReader("C:\\sample.txt")) 
{ 

    var fields = (reader.ReadLine() ?? "").Split(separator); 

    // Dynamically add the columns 
    var table = new DataTable(); 
    table.Columns.AddRange(fields.Select(field => new DataColumn(field)).ToArray()); 

    while (reader.Peek() >= 0) 
    { 
     var line = reader.ReadLine() ?? ""; 

     // Split the values considering the quoted field values 
     var values = Regex.Split(line, ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)") 
      .Select((value, current) => value.Trim()) 
      .ToArray() 
      ; 

     // Add those values directly 
     table.Rows.Add(values); 
    } 

    // Demonstrate the results 
    foreach (DataRow row in table.Rows) 
    { 
     Console.WriteLine(); 
     foreach (DataColumn col in table.Columns) 
     { 
      Console.WriteLine("{0}={1}", col.ColumnName, row[col]); 
     } 
    } 
} 
+0

已更新用於創建'DataTable' –

+0

@downvoter關注評論? –

+0

如果它實際上是被解析的CSV,那麼就有一些基本問題。特別是,引用字段中的嵌入換行符搞砸了解析,並且它不處理字段中的轉義引號,並且它不會從引用字段中除去引號字符。代碼對於給定的輸入工作正常,但不適用於更一般的情況。 – dreamlax

0

沒有,只是沒有。不要嘗試編寫自己的CSV解析器 - 沒有理由這樣做。

This article解釋了這個問題,並建議使用FileHelpers - 這是足夠體面的。

也有Lumenworks reader這是更簡單,一樣有用。

最後,顯然你可以使用DataSets鏈接到你的CSV as described here。我沒有嘗試這個,但看起來很有趣,如果可能過時了。

相關問題