假设我有一个很大的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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将在运行时失败,并显示以下错误:
继承IEnumerable的类型无法自动映射。您是否意外地调用了作用于单个记录的GetRecord或WriteRecord而不是调用了作用于记录列表的GetRecords或WriteRecords?
请注意,中没有有趣的事情发生UpdateRecord,实际上上面的这一行可以完全注释掉。
发生的情况是GetRecord返回an ExpandoObject,然后WriteRecord对此对象造成阻塞。
使这项工作最好的方法是什么?
更新
显而易见,我很清楚:我完全收到此错误是因为CSVHelper不支持ExpandoObjects进行WriteRecord通话。我正在寻找建议,以使这项工作最简单的方法。
| 归档时间: |
|
| 查看次数: |
1091 次 |
| 最近记录: |