我有一个包含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。
我有一个包含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。
您可以将电子表格作为“经典”数据源(如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
希望它可以帮助
您可以创建一个扩展功能是这样的:
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的是列名) 。你可能想在那里添加一些空检查(除其他外),但希望这会让你开始。
如果我误解了关于该问题的任何内容或者是否有任何问题,请让我知道!