使用CsvHelper将引用写入特定的CSV字段

4
当编写CSV文件时,需要仅引用特定列。使用CsvHelper 6.1.0,是否有一种方法可以单独配置字段,特别是它们是否被引用?

字段1,字段2,字段3,字段4,字段5,字段6 “引用”,“引用”,未引用,未引用,未引用,“引用” “引用”,“引用”,未引用,未引用,未引用,“引用”

到目前为止,我只在配置对象中发现了QuoteAllFields和QuoteNoFields。

为什么要使用CsvHelper来编写非常简单的csv文件?最好使用StreamWriter类进行编写。您可以使用字符串outputline = string.Join(“,” new string [] {colA,colB,colC,colD})创建CSV行,然后使用writer.Writeline(outputline)进行写入。 - jdweng
@jdweng 做了不必要显示的相当多工作。只需要学习如何在每个字段上按需配置引号。 - disassemble-number-5
不知道你是否能够使用CSVHelper。使用Net库方法非常简单。 - jdweng
2个回答

3
您可以使用类映射来实现此操作。
您可以首先使用自动映射功能对类进行映射,然后编辑您想要用引号包含的字段。类似于以下内容:
public sealed class MyClassMap : ClassMap<MyClass> {
    public MyClassMap() {
        AutoMap();
        Map(m => m.Field1).ConvertUsing(m => $"\"{m.Field1}\"");
        Map(m => m.Field2).ConvertUsing(m => $"\"{m.Field2}\"");
        Map(m => m.Field6).ConvertUsing(m => $"\"{m.Field6}\"");
    }
}

那么当您编写文件时,可以这样应用它:
CsvWriter myWriter = new CsvWriter(stream);
myWriter.Configuration.RegisterClassMap<MyClassMap>();

我不确定这是否是“正确”的做法,但它似乎是最简单的。您可以实现一个TypeConverter来添加引号,但对于如此简单的事情来说,这似乎太麻烦了...


这个解决方案在我看来插入了太多的引号。为了修复它,我不得不使用csv.Configuration.QuoteNoFields = true;,但是这会影响我的其他字符串字段:| - Lee Richardson

3

我知道OP问的是6.1.0版本,但是为了帮助其他人,从12版本开始有一个更好的解决方案:

var indexesToQuote = new[] { 0, 2 };
csv.Configuration.ShouldQuote = (field, context) => 
    indexesToQuote.Contains(context.Record.Count) && 
    context.HasHeaderBeenWritten;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接