较新版本的CsvHelper中的IWriterConfiguration.UseExcelLeadingZerosFormatForNumerics等效于什么?

时间:2019-02-06 14:07:35

标签: c# csvhelper

我们目前正在将一堆旧的NuGet软件包升级到最新版本。 CsvHelper在我们使用的先前版本(2.x)和最新版本(12.x)之间移动了一堆东西。更改日志没有提及很多此类更改(或者至少没有明确指出每个更改日志条目中更改了哪些属性或方法),这使我们的升级过程受挫。

IWriterConfiguration.UseExcelLeadingZerosFormatForNumerics设置在升级中消失了,我很难找出较新版本中的等效设置。我试图跟踪GitHub repository中的提交历史记录中的更改,但是主要的版本号更改之一涉及到许多类的重命名,这意味着我很难在此更改的位置找到提交发生,所以我看不到较新版本中的等效设置。

我们需要确保升级之前系统的行为与新行为相同。有谁知道我将如何在当前软件包版本中复制此配置设置引起的行为?

1 个答案:

答案 0 :(得分:0)

Jeroen Mostert指出,此配置选项的行为的原始实现是在虚拟CsvWriter.WriteField方法中。因此,可以根据需要重新实现原始行为。

由于方法的结构,似乎没有一种方法可以重新实现此功能,而如果程序包维护者进行了更改,则该方法不会破坏或引起难以发现的问题CsvWriter.WriteField在未来的行为或实现。但是,此派生类至少应适用于CsvHelper(12.1.2)的当前版本:

public class ExcelFormatCsvWriter : CsvWriter
{
    public bool UseExcelFormat
    {
        get; set;
    }

    public ExcelFormatCsvWriter(TextWriter writer) : base(writer)
    {
    }

    public override void WriteField(string field, bool shouldQuote)
    {
        if (shouldQuote && !string.IsNullOrEmpty(field))
        {
            field = field.Replace(Context.WriterConfiguration.QuoteString, Context.WriterConfiguration.DoubleQuoteString);
        }

        if (UseExcelFormat && !string.IsNullOrEmpty(field) && field[0] == '0' && field.All(Char.IsDigit))
        {
            field = "=" + Context.WriterConfiguration.QuoteString + field + Context.WriterConfiguration.QuoteString;
        }
        else if (shouldQuote)
        {
            field = Context.WriterConfiguration.Quote + field + Context.WriterConfiguration.Quote;
        }

        Context.Record.Add(field);
    }
}