【问题标题】:How to read a CSV file using linq after the csv file is downloaded from Azure? [duplicate]从 Azure 下载 csv 文件后,如何使用 linq 读取 CSV 文件? [复制]
【发布时间】:2015-08-05 01:34:51
【问题描述】:

我正在尝试查找如何使用 linq 读取 csv 文件的示例。我的问题是到目前为止我找到的示例,csv 文件存储在本地机器上,我正在从 azure 中提取 csv 文件。这是我到目前为止找到的示例:

var stuff = from l in File.ReadLines(filename)
                            let x = l.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)
                                     .Skip(1)
                                     .Select(s => int.Parse(s))
                            select new
                            {
                                Sum = x.Sum(),
                                Average = x.Average()
                            };

问题在于我从 Azure 中提取,我必须使用 DownloadToStream 并将文件移动到 MemoryStream。当我必须使用 MemoryStream 时,应该用什么替换“File.ReadLines(filename)”?

【问题讨论】:

  • 除非您可以控制生成 CSV 的代码,否则您可能需要一个专用的 CSV 库用于解析步骤。谈到 CSV 时,陷阱比您想象的要多得多
  • 看看TextFieldParser - 它可以处理流和处理 CSV 文件。它在 Microsoft.VisualBasic.FileIO 命名空间中(是的,尽管它的名字也可以被 C# 使用)。参见TextFieldPaser Constructor (Stream)
  • 对于 TextFieldParser,它是否还可以确认文件确实是 csv 而不是常规文本文件以及可能出现的任何其他陷阱?如果没有,有人可以推荐一个好的 csv 库来解决这些问题并提供良好的性能吗?
  • @user1790300 - 确认文件确实是 CSV 文件是什么意思?基于什么标准?
  • @Tim,有没有办法确认格式确实是 csv?

标签: c# linq csv azure-blob-storage


【解决方案1】:

一旦您在 Stream 中获得数据,就会有很多库可以让读取 CSV 变得非常容易。您需要避免使用Split(),因为 CSV 比这要复杂一些,而且很容易出错。

可以使用Ctl.Data NuGet 包来执行此操作:

class MyPoco
{
    // CSV file must have a header with these property names.
    public int Foo { get; set; }
    public string Bar { get; set; }
    public DateTime Baz { get; set; }

    public static IEnumerable<MyPoco> Read(CloudBlockBlob blob)
    {
        using(Stream s = blob.OpenRead())
        using(StreamReader sr = new StreamReader(s))
        {
            foreach(MyPoco x in Ctl.Data.Formats.Csv.ReadObjects<MyPoco>(sr))
            {
                yield return x;
            }
        }
    }
}

(警告:我是这个包的作者)

【讨论】:

  • 对于您的 CSV libaray,它是否还可以确认该文件确实是 csv 而不是常规文本文件以及可能出现的任何其他陷阱?
  • 如果输入不是有效的 CSV,库将抛出异常,除了格式之外,您还可以使用基于注释的属性验证来检查输入是否在预期参数范围内。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 2016-02-22
  • 1970-01-01
  • 2023-03-31
  • 2021-07-28
  • 2013-04-03
  • 1970-01-01
相关资源
最近更新 更多