2012-07-19 124 views
1

我正在嘗試將CS​​V讀取到數據表中。在不知道結構的情況下將CSV讀取到數據表中

CSV可能有數百列,最多隻有20行。

它會是這個樣子:

+----------+-----------------+-------------+---------+---+ 
| email1 |  email2  | email3 | email4 | … | 
+----------+-----------------+-------------+---------+---+ 
| ccemail1 | anotherccemail1 | 3rdccemail1 | ccemail | | 
| ccemail2 | anotherccemail2 | 3rdccemail2 |   | | 
| ccemail3 | anotherccemail3 |    |   | | 
| ccemail4 | anotherccemail4 |    |   | | 
| ccemail5 |     |    |   | | 
| ccemail6 |     |    |   | | 
| ccemail7 |     |    |   | | 
| …  |     |    |   | | 
+----------+-----------------+-------------+---------+---+ 

我想使用genericparser此;不過,我相信它需要你知道列名。

string strID, strName, strStatus; 
using (GenericParser parser = new GenericParser()) 
{ 
    parser.SetDataSource("MyData.txt"); 

    parser.ColumnDelimiter = "\t".ToCharArray(); 
    parser.FirstRowHasHeader = true; 
    parser.SkipStartingDataRows = 10; 
    parser.MaxBufferSize = 4096; 
    parser.MaxRows = 500; 
    parser.TextQualifier = '\"'; 

    while (parser.Read()) 
    { 
     strID = parser["ID"]; //as you can see this requires you to know the column names 
     strName = parser["Name"]; 
     strStatus = parser["Status"]; 

     // Your code here ... 
    } 
} 

有沒有辦法在不知道列名的情況下將這個文件讀入數據表?

+0

[0] [1] ........ – Paparazzi 2012-07-19 21:46:53

+0

CSV意味着真的用逗號分隔嗎?總是有頭或不是? '...'意味着可能有更多的列,而你不知道有多少或這個列是空的? – 2012-07-19 21:47:29

+0

@TimSchmelter是的,總是會有一個標題 – 2012-07-19 21:47:50

回答

2

我看了看源代碼,你可以用列號訪問由列索引的數據量太大,這樣

var firstColumn = parser[0] 

更換0。 可以使用

parser.ColumnCount 
+0

非常感謝。 blam建議同樣的事情,但我不知道有多少columsn有 – 2012-07-19 21:49:05

+0

niiiiiiiiiiiiiiiiice !!!!!!!!!!!!!!會嘗試它 – 2012-07-19 21:51:15

0

我不熟悉GenericParser被認爲colums的號碼,我會建議使用的工具,如TextFieldParserFileHelpers或本CSV-Reader

但這種簡單的手工方法應該也行:

IEnumerable<String> lines = File.ReadAllLines(filePath); 
String header = lines.First(); 
var headers = header.Split(new[]{','}, StringSplitOptions.RemoveEmptyEntries); 
DataTable tbl = new DataTable(); 
for (int i = 0; i < headers.Length; i++) 
{ 
    tbl.Columns.Add(headers[i]); 
} 
var data = lines.Skip(1); 
foreach(var line in data) 
{ 
    var fields = line.Split(new[]{','}, StringSplitOptions.RemoveEmptyEntries); 
    DataRow newRow = tbl.Rows.Add(); 
    newRow.ItemArray = fields; 
} 
2

它是如此簡單!

 var adapter = new GenericParsing.GenericParserAdapter(filepath); 
     DataTable dt = adapter.GetDataTable(); 

這會自動爲您做所有事情。

相關問題