2012-07-19 123 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(); 

这会自动为您做所有事情。

相关问题