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

时间:2016-12-02 22:52:29

标签: c# .net 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);
        }
    }
}

在运行时失败,出现以下错误:

  

继承IEnumerable的类型无法自动映射。你是否   不小心调用GetRecord或WriteRecord作用于单个   记录而不是调用作为a的GetRecords或WriteRecords   记录清单?

请注意,UpdateRecord中没有任何有趣的事情发生,实际上上面的这一行可以完全注释掉。

GetRecord会在此对象上返回ExpandoObject然后WriteRecord扼流圈。

使这项工作的最佳方法是什么?

更新 就这么清楚:我完全意识到我收到此错误是因为CSVHelper不支持ExpandoObject调用WriteRecord。我正在寻找建议,以最简单的方式来完成这项工作。

1 个答案:

答案 0 :(得分:4)

this commit似乎添加了写ExpandoObject的功能。

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

如果您这样做,请注意,您必须在每个NextRecord后致电WriteRecord。在2.16.3中,CVSHelper会为你调用它,所以它有点破坏API变化