假设我有一个大型的csv文件,我想阅读,修改和回写。也许我想将字段分隔符从逗号更改为制表符。也许我想将引号字符从'更改为'。或者我可能想在第一列中为每个值添加加号。由于文件很大,我不想一次性将它加载到内存中,我想逐个记录。
所以我写了这样的代码:
var inPath = @"infile.txt";
var outPath = @"outfile.txt";
CsvConfiguration readCf = GetReadConfiguration();
CsvConfiguration writeCf = GetWriteConfiguration();
using (var streamin = new FileStream(inPath, FileMode.Open))
using (var streamReader = new StreamReader(streamin))
{
using (var csvReader = new CsvReader(streamReader, readCf))
using (var csvWriter = new CsvWriter(new StreamWriter(outPath), writeCf))
{
while (csvReader.Read())
{
var currentRecord = csvReader.GetRecord<dynamic>();
UpdateRecord(currentRecord);
csvWriter.WriteRecord(currentRecord);
}
}
}
在运行时失败,出现以下错误:
继承IEnumerable的类型无法自动映射。你是否 不小心调用GetRecord或WriteRecord作用于单个 记录而不是调用作为a的GetRecords或WriteRecords 记录清单?
请注意,UpdateRecord
中没有任何有趣的事情发生,实际上上面的这一行可以完全注释掉。
GetRecord
会在此对象上返回ExpandoObject
然后WriteRecord
扼流圈。
使这项工作的最佳方法是什么?
更新
就这么清楚:我完全意识到我收到此错误是因为CSVHelper不支持ExpandoObject
调用WriteRecord
。我正在寻找建议,以最简单的方式来完成这项工作。
答案 0 :(得分:4)
this commit似乎添加了写ExpandoObject
的功能。
请注意,这不是最新的nuget版本(截至撰写本文时为2.16.3),而是针对下一个3.x版本。如果它是你从github获得最新测试版的一个选项并使用它。
如果您这样做,请注意,您必须在每个NextRecord
后致电WriteRecord
。在2.16.3中,CVSHelper会为你调用它,所以它有点破坏API变化