更改CSV文件,使用动态映射进行读写

And*_*ykh 6 .net c# csvhelper

假设我有一个很大的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通话。我正在寻找建议,以使这项工作最简单的方法。

And*_*ykh 4

看来这次提交ExpandoObject中添加了写入功能。

请注意,这不是最新的 nuget 版本(截至撰写本文时为 2.16.3),而是下一个 3.x 版本。如果您可以选择从 github 获取最新的测试版并使用它。

如果这样做,请注意您必须NextRecord在每次之后调用WriteRecord。在 2.16.3 中,CVSHelper 会为您调用它,因此这是一个破坏性的 API 更改