假设我有一个大的csv文件,我想要读取,修改和回写。也许我想将字段分隔符从逗号更改为制表符。也许我想将引号字符从'改为',或者可能是我想为第一列中的每个值添加一个加号,由于文件很大,我不想一次加载到内存中,我想读它通过记录记录更改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);
}
}
}
这种失败在运行时,出现以下错误:
Types that inherit IEnumerable cannot be auto mapped. Did you accidentally call GetRecord or WriteRecord which acts on a single record instead of calling GetRecords or WriteRecords which acts on a list of records?
。注意,没有什么有趣的事发生在UpdateRecord
,其实这一行上面可以完全评论ou吨。
发生什么事是GetRecord
返回ExpandoObject
,然后WriteRecord
扼流器在此对象上。
使这项工作的最佳方式是什么?
更新 只是所以很清楚:我充分认识到,我得到这个错误是因为CSVHelper不支持ExpandoObject
S表示WriteRecord
电话。我正在寻找建议,以便完成此项工作。
错误是告诉你使用GetRecords(复数)而不是单数。我的意思是它暗示它。你尝试过吗? – CodingYoshi
@CodingYoshi,不,我不需要。 –
看看Mar L的答案[这里](http://stackoverflow.com/questions/33294738/read-all-values-from-csv-into-a-list-using-csvhelper),看看是否有帮助你。 – CodingYoshi