【问题标题】:get data from csv by columnname with LINQ使用 LINQ 按列名从 csv 获取数据
【发布时间】:2010-11-08 15:04:07
【问题描述】:

我有一个 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 的行,如何将行值作为字符串 [] 获取?这应该返回第二行的 string[] 值。

我在 VS2010 中使用 C# 4.0。

【问题讨论】:

    标签: c# linq csv


    【解决方案1】:

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

    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

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      你可以像这样创建一个扩展函数:

          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 是列名)。您可能想在其中添加一些空检查(除其他外),但希望这可以帮助您入门。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多