使用LINQ通过列名从csv获取数据

时间:2010-11-08 15:04:07

标签: c# linq csv

我有一个包含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。

2 个答案:

答案 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是列名称)。你可能想在那里添加一些空检查(除其他外),但希望这会让你开始。

如果我误解了这个问题,或者有任何问题,请告诉我!