【问题标题】:Read a CSV to a C# object to be able to do LINQ query on it [closed]将 CSV 读取到 C# 对象,以便能够对其进行 LINQ 查询 [关闭]
【发布时间】:2016-02-24 04:03:32
【问题描述】:

我有一个 csv 文件,大约 10.000 行,共 20 列。我需要将此文件读入 C# 对象才能对此对象执行 LINQ 查询。你喜欢什么?

【问题讨论】:

  • 除非你有很长的列和复杂的数据,而且你需要处理很多特殊情况,你可以自己写一个简单的程序。你有没有尝试过?
  • 你不能把它转换成数据库吗?
  • @Jelly:不,我不能使用数据库。
  • 请注意,在 SO 上最好不要有“图书馆推荐问题”或“你喜欢什么”问题。
  • 为什么我的帖子被否决了?你能指望什么?对于那些对我的问题投反对票的人:告诉我我的问题出了什么问题。

标签: c# linq csv


【解决方案1】:

这部分非常简单,因为您可以在 IEnumerable<T> 上运行 LINQ 查询 - 换句话说,您可以在 foreach 循环上执行的任何操作都是您可以查询的。有很多方法可以做到这一点。

但是,首先,我假设您已经知道要处理的数据的架构(即,您已经知道第 17 列是生日或类似的东西)。如果这样做,您将能够非常快速地构建单个 C# 数据对象,您的 LINQ 查询可以轻松地在其上运行。如果没有,您的 C# 数据对象可能会改为关联数组(例如带有 string 键的 HashMap)。

如果您必须对数据运行多个查询,您可以简单地逐行读取每一行,并将其放入List<T> 实例中。

但如果你只需要一次传递CSV数据,你可以创建一个迭代器方法并且只逐行读取:

public IEnumerable<DataObject> ReadCSVFile(Stream input)
{
  StreamReader reader = new StreamReader(input);
  string line;
  while ((line = reader.ReadLine()) != null) // this sets and checks line at the same time
  {
    DataObject data = new DataObject();

    // ... fill in the parameters of your data object here ...

    // this will return the single data object,
    // let your LINQ query process it, and then continue the loop
    yield return data;
  }
  reader.Close();
}

然后,当您执行 LINQ 查询时,您调用该方法,如

from data in ReadCSVFile(dataStream)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多