【问题标题】:CsvParser misses some places with specified delimeterCsvParser 遗漏了一些指定分隔符的地方
【发布时间】:2020-09-18 19:33:45
【问题描述】:

我有一个假设解析数据并使用“@BELL”作为分隔符的 C# 代码。 (BELL 是 ASCII 码)

但有些值的末尾有另一个“@”,因此它看起来像这样“0.0000000@SS-AA&-BB-C)@@021328@STRING_Price”。 CsvParser 确实在第一个“@”处分裂,但错过了第二次出现(它有“@@”)并在第三次出现时分裂得很好。 数据不能在源中修改,必须保持原样。

我们正在使用 CsvHelper v 15.0.0。

这是一个已知的 CsvParser 问题吗? (我试图在不添加额外解析/替换的情况下逃脱)。

这是我的代码(我已对其进行了简化并使用本地文件进行测试,但实际上它是转到 AzureBlobStorage):

private static readonly string delimiter = "@" + new string('\u0007', 1);
private static string filePath = "C:\\Downloads\\000_From_Blob";

private static IEnumerable<string[]> ParseCompressedClientFormattedStream(string filePath, string delimiter)
{
    using (var remoteStream = File.OpenText(filePath))
    {
        using (var csvReader = new CsvParser(remoteStream, new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = delimiter.ToString(), BadDataFound = null }))
        {
                for (; ; )
                {
                    var line = csvReader.Read();
                    if (line != null) yield return line;
                    else break;
                }
         }
    }
}

以下是源文件中的 2 行示例。第一行被正确解析。但是第二个没有在它有双“@”的地方分裂:

110@A778@10211@2@Joe@0.0000000@SS-AA&-BB-C)@@SS-AA&-BB-C)@021328@STRING_Price@$9.99@@False
111@A778@10211@2@Joe@0.0000000@SS-AA&-BB-C)@@@SS-AA&-BB-C)@@021328@STRING_Price@$9.99@@False

【问题讨论】:

  • 是否可以将数据样本附加到问题中?
  • @YegorAndrosov 如何将文件附加到这个问题?我找不到它的选项。
  • 顺便说一句,您可以将分隔符声明为const string delimiter = "@\u0007";const string Bell = "\u0007"; const string delimiter = "@" + Bell;。这样可以节省少量垃圾(一切都是 const,没有调用字符串构造函数,没有运行时字符串连接)
  • 我试图在要点中重现您的文件并使用您的代码,它给了我 14 单元数组,第二行的一些块末尾带有“@”。请检查一下。对我来说一切都很好gist.github.com/pwrigshi/…
  • 如果你需要在第二种情况下有 16 个块,猜你必须先.Replace("@@", "@BEL@")

标签: c# csv parsing csvhelper


【解决方案1】:

这似乎是 v15.0.0 的 CsvHelper 包中的一个错误。 将其更新到最新版本 15.0.5 - 已解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多