我正在尝试使用CsvHelper读取CSV文件并从中创建一个DataTable。第一行将是提供列名称的头记录,但除此之外,文件的结构是未知的。如果我使用以下代码(摘自CsvHelper的作者的示例),则它可以工作。
using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader))
{
// Do any configuration to `CsvReader` before creating CsvDataReader.
using (var dr = new CsvDataReader(csv))
{
var dt = new DataTable();
dt.Load(dr);
}
}
但是,如果我为StreamReader使用替代构造函数,该构造函数将Stream作为参数而不是文件路径,则CsvDataReader的创建将失败,并显示错误消息“不支持同步读取”。
我尝试了CsvHelper的其他几种方法来尝试以不同的方式处理数据,但是在通过传递Stream而不是文件路径创建StreamReader的任何时候,我都会遇到相同的错误。我开始怀疑真正的问题在于StreamReader的实现还是CsvHelper。在我的情况下(使用Blazor Server应用程序),在Stream中传递更为有意义。有任何想法吗?
可能您正在使用的流需要异步读取?以下对我有用。
var request = WebRequest.Create("https://people.sc.fsu.edu/~jburkardt/data/csv/addresses.csv");
var response = request.GetResponse();
using (var stream = response.GetResponseStream())
using (var csv = new CsvReader(new StreamReader(stream)))
{
using (var dr = new CsvDataReader(csv))
{
var dt = new DataTable();
dt.Load(dr);
}
}