2015-12-07 80 views
0

我正在使用C#中的TextFieldParser讀取CSV文件。我可以設法讀一個簡單的CSV文件,但這個CSV文件依賴於第一列名,這樣多的格式類型:使用TextFieldParser根據其值讀取列

>>Name, Age, Location, 
"Joe","29","NY" 
"Maggie", "25", "NJ" 
>>City, State, Population 
"New York", "NY","8.49" 

的CSV有資料的更多類型。

我想根據它們的格式來讀取列,但它只讀取列名。我怎樣才能讓它只讀取目標格式類型?這確實是代碼的一部分是在這裏:

while (!parser.EndOfData) 
{ 
    if (parser.ReadFields().Contains(">>Name")) 
    { 
     header = true; 
     string[] fields = parser.ReadFields(); 

     if (header) 
     { 
     foreach (var val in fields) 
     { 
      dt.Columns.Add(val); 
     } 

     header = false; 
     continue; 
     } 

     dt.Rows.Add(fields); 
    } 
    else {}; 
} 

編輯:

的「>>」符號是說,當我有列名標誌。

+0

什麼是真正的樣本文件?目前還不清楚「>>標題,可以忽略 >>名稱,年齡,位置, 」喬「,」29「,」紐約州「」的意思。這是真實的文字還是與您的評論混雜在一起? –

+0

什麼是分析器變量?您也可以使用[FileHelpers](http://www.filehelpers.net/example/Advanced/MultiRecordEngine/)庫來完成此任務。 –

+0

此外,只有在'parser.ReadFields()。Contains(「>> Name」)''時纔會輸入'if'。所以下面的'if(header)'是無形的,因爲它總是頭部。下一個問題:'parser.ReadFields()'會使讀者進入下一行,所以當你執行兩次時,你會得到第二行的字段而不是頭字段。 –

回答

0

看來,如果該文件包含多個表的數據,每一個表格的標題與>>開始。你可以通過這種方式補DataSet

DataSet ds = new DataSet(); 
using (var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(@"C:\Temp\textfile.txt")) 
{ 
    parser.Delimiters = new string[] { "," }; 
    parser.HasFieldsEnclosedInQuotes = true; // <--- !!! 
    string[] lineFields; 
    while ((lineFields = parser.ReadFields()) != null) 
    { 
     if (lineFields[0].StartsWith(">>")) 
     { 
      DataTable dt = new DataTable(); 
      DataColumn[] cols = lineFields 
       .Where(t => !String.IsNullOrWhiteSpace(t)) 
       .Select(t => new DataColumn(t.Trim(' ', '>'))) 
       .ToArray(); 
      dt.Columns.AddRange(cols); 
      ds.Tables.Add(dt); 
     } 
     else if(ds.Tables.Count > 0) 
     { 
      DataTable lastTable = ds.Tables[ds.Tables.Count - 1]; 
      lineFields = lineFields 
       .Where(t => !String.IsNullOrWhiteSpace(t)) 
       .Take(lastTable.Columns.Count) 
       .Select(t => t.Trim()) 
       .ToArray(); 
      lastTable.Rows.Add(lineFields); 
     } 
    } 
} 

測試你的樣本數據。一個DataSet有以下兩個DataTables產生:

表1:

enter image description here

表2:

enter image description here

0

你忘了使用SetDelimeters方法來指定分隔符:

using (var parser = new TextFieldParser(path)) 
{ 
    parser.SetDelimiters(","); 
    while (!parser.EndOfData) 
    { 
     string[] results = parser.ReadFields(); 
     if (results[0].StartsWith(">>")) 
     { 
      // headers 
     } 
     else 
     { 
      // data 
     } 
    } 
}