我有一个包含160列和几行行数据的csv文件(第一列名称,第二列和更多数据)。列由a分隔;和行,
在Excel中打开文件时,其格式如下:
A B C D E F
1 2 3 4 5 6
7 8 9 10 11 12
我想用C#读取CSV文件,尽可能多地使用LINQ 。
(适用编辑) 如何将行值作为字符串[]获取为“E”列中的值为5的行?这应该返回第二行的字符串[]值。
我在VS2010中使用C#4.0。
答案 0 :(得分:0)
您可以将电子表格查询为“经典”数据源,如Sql Server。创建指向文件路径的连接字符串并使用Microsoft.jet.oledb.4.0提供程序(在x64操作系统上不可用,在这种情况下,您必须使用第三方组件来建立连接)。完成此操作后,您可以在.xls上运行sql语句。 您不能像使用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
希望有所帮助
答案 1 :(得分: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是列名称)。你可能想在那里添加一些空检查(除其他外),但希望这会让你开始。
如果我误解了这个问题,或者有任何问题,请告诉我!