假设我有一个大型的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,这些方法作用于单个记录,而不是调用GetRecords或WriteRecords,这些方法作用于记录列表?
请注意,在UpdateRecord
中没有任何有趣的事情发生,实际上可以完全注释掉上面的代码。
问题在于GetRecord
返回一个ExpandoObject
,然后WriteRecord
在此对象上出现问题。
最好的解决方法是什么?
更新:
只是为了明确:我完全意识到之所以会出现这个错误是因为CSVHelper不支持ExpandoObject
用于WriteRecord
调用。 我正在寻找建议,以便最简单地解决此问题。