2010-11-08 43 views
0

我有一个包含160列和几行行数据(第1列名称,第2和更多数据)的csv文件。列由a分隔;并通过行,通过LINQ的列名从csv获取数据

当打开Excel中的文件是格式如下的例子:

A B C D E F 
1 2 3 4 5 6 
7 8 9 10 11 12 

我想读在C#和使用LINQ尽可能 CSV文件。

(编辑) 如何获取行值为string []为例如在列“E”中的值为5?这应该返回第二行的字符串[]值。

我在VS2010中使用C#4.0。

回答

0

您可以将电子表格作为“经典”数据源(如Sql Server)进行查询。创建指向文件路径的连接字符串并使用Microsoft.jet.oledb.4.0提供程序(它在x64操作系统上不可用,在这种情况下,您将不得不使用第三方组件建立连接)。完成此操作后,您可以对您运行sql语句.xls。 您不能像使用LINQ to SQL一样直接在xls上使用LINQ运行查询(datacontext只能通过sql server创建)。 要访问某行一列的值,查询之后,你必须遍历返回的DataReader:

using (DbDataReader dr = command.ExecuteReader()) 
    { 
     while (dr.Read()) 
     { 
      string result = dr["E"].ToString(); 
     } 
    } 

在这里你可以找到一些有用的相关信息:http://www.davidhayden.com/blog/dave/archive/2006/05/26/2973.aspx

希望它可以帮助

0

您可以创建一个扩展功能是这样的:

public static IEnumerable<T> RowValuesFromColumnID<T>(this IEnumerable<IEnumerable<T>> source, T columnID) { 
     var index = source.First().Select((x,i) => new { x, i }).Where(x => x.x.Equals(columnID)).FirstOrDefault().i; 
     return source.Skip(1).SelectMany(x => x.Where((y,i) => i == index)); 
    } 

然后拿到字符串数组,像这样:

//read in file 
    var csv = "A;B;C;D;E;F,1;2;3;4;5;6,7;8;9;10;11;12"; 

    csv.Split(',').Select(x => x.Split(';')).RowValuesFromColumnID("E").ToArray(); 

将返回

5 
11 

注:上面的扩展功能提供没有错误处理任何并预计完美的输入(预计第一IEnumerable的是列名) 。你可能想在那里添加一些空检查(除其他外),但希望这会让你开始。

如果我误解了关于该问题的任何内容或者是否有任何问题,请让我知道!