C# 使用LINQ按columnname从csv获取数据

C# 使用LINQ按columnname从csv获取数据,c#,linq,csv,C#,Linq,Csv,我有一个csv文件,有160列和几行数据(第一列名称、第二列和更多数据)。柱体由一个柱体分隔;一排一排 在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。您可以将电子表格作为Sql Server之类的“

我有一个csv文件,有160列和几行数据(第一列名称、第二列和更多数据)。柱体由一个柱体分隔;一排一排

在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。

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

using (DbDataReader dr = command.ExecuteReader())
    {
        while (dr.Read())
        {
            string result = dr["E"].ToString();
        }
    }
在这里您可以找到一些有用的信息:


希望它有帮助

您可以创建如下扩展函数:

    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));
    }
哪个会回来

5
11
注意:上面的扩展函数提供无任何错误处理,并期望完美输入(它期望第一个IEnumerable是列名)。您可能希望在其中添加一些空检查(以及其他内容),但希望这将帮助您开始

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

5
11