C# 从Azure下载CSV文件后,如何使用linq读取CSV文件?
我试图找到一个如何使用linq读取csv文件的示例。我的问题是,到目前为止我找到的示例中,csv文件存储在本地计算机上,我正在从azure中提取csv文件。以下是我到目前为止发现的示例:C# 从Azure下载CSV文件后,如何使用linq读取CSV文件?,c#,linq,csv,azure-storage-blobs,C#,Linq,Csv,Azure Storage Blobs,我试图找到一个如何使用linq读取csv文件的示例。我的问题是,到目前为止我找到的示例中,csv文件存储在本地计算机上,我正在从azure中提取csv文件。以下是我到目前为止发现的示例: var stuff = from l in File.ReadLines(filename) let x = l.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)
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变得非常容易。您应该避免使用Split()
,因为CSV比这更复杂,而且很容易出错
其中一个库是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;
}
}
}
}
类MyPoco
{
//CSV文件的标题必须包含这些属性名称。
公共int Foo{get;set;}
公共字符串条{get;set;}
公共日期时间Baz{get;set;}
公共静态IEnumerable读取(CloudBlockBlob)
{
使用(Stream s=blob.OpenRead())
使用(StreamReader sr=新StreamReader)
{
foreach(MyPoco x在Ctl.Data.Formats.Csv.ReadObjects(sr)中)
{
收益率x;
}
}
}
}
(注意:我是这个软件包的作者)除非您可以控制生成CSV的代码,否则您可能需要一个专用的CSV库用于解析步骤。当谈到CSV的利害关系时,会有比你想象的多得多的问题——它可以处理流和CSV文件。它位于Microsoft.VisualBasic.FileIO
名称空间中(是的,它可以被C#使用,尽管它的名称不同)。另请参见。对于TextFieldParser,它能否确认该文件确实是csv文件,而不是常规文本文件以及可能出现的任何其他陷阱?如果没有,有人能推荐一个好的csv库来解决这些问题并提供良好的性能吗?@user1790300-什么意思?确认该文件确实是csv文件?基于什么标准?@Tim,有没有办法确认格式确实是csv?对于您的csv库,它是否也可以确认文件确实是csv,而不是常规文本文件以及可能出现的任何其他陷阱?如果输入不是有效的csv,库将抛出异常,除了格式之外,您还可以使用基于注释的属性验证来检查输入是否在预期参数范围内。