【问题标题】:Semicolon delimiter inside quotes引号内的分号分隔符
【发布时间】:2021-05-06 16:38:47
【问题描述】:

我想使用 CsvHelper 读取 csv 文件。分隔符有三个字符“;” 仍然收到 BadDataException。

代码示例:

using var textReader = new StringReader("AA\";\"BB\";\"\n"); 
using var csvReader = new CsvReader(textReader, config);
csvReader.Read();

【问题讨论】:

  • 您还应该出示您的config
  • 另外,using var ... 在我看来不是有效的 C# 代码。
  • @Filburt - 即c# 8 syntax
  • 那不是 CSV。在 CSV 引号中是元字符,您需要对它们进行转义或构造正确的 CSV,例如 "A","B"
  • 您是否将config.Delimiter 设置为";"?在最新版本中,您还需要将Mode 设置为CsvMode.NoEscape

标签: c# .net csvhelper


【解决方案1】:

根据您提到的评论中的示例,

您正在读取这样一个无效的 CSV 字符串

I";"FH";"10222";"000001022220210505.010243";"wxt";"20210505";"";"20210505";"20210505";"170000";"01.02.43";"";"

在传递给 CsvReader 之前做一个预处理

var csv = "Substitute data from csv file here";
csv = "\"" + csv;
csv = csv.Substring(0, csv.Length - 2);
var textReader = new StringReader(csv); 
var csvReader = new CsvReader(textReader, config);
csvReader.Read();

这会给你

"I";"FH";"10222";"000001022220210505.010243";"wxt";"20210505";"";"20210505";"20210505";"170000";"01.02.43";""

【讨论】:

  • 问题是我们从外部服务收到我们无法控制的报告。数据位于带有 csv 扩展名的文件中,但它们使用“;”分隔。请找到示例行:I";"FH";" 10222";"000001022220210505.010243";"wxt";"20210505";"";"20210505";"20210505";"170000";"01.02.43";"";"
  • 根据您的评论修改了答案
  • 小心尝试在非 CSV 文本上使用 CsvReader; CSV 格式为more complicated than you realize;它不仅仅是带有分隔记录的魔术字符串的任意文本。例如,@macfly 如何表示引号字符? ";""";"?您的代码将无法解决此问题。他的文本不是 CSV,尝试使用 CSV 解析器只会导致悲伤。
  • 引号在 CSV 中表示为元字符,并带有转义符。仅当他的 CSV 在 (\") 中包含引号时,这才有效
【解决方案2】:

使用您的 cmets 中的示例行,这似乎可行。

void Main()
{
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        Delimiter = "\";\"",
        HasHeaderRecord = false,
        Mode = CsvMode.NoEscape
    };
    
    using (var reader = new StringReader("I\";\"FH\";\" 10222\";\"000001022220210505.010243\";\"wxt\";\"20210505\";\"\";\"20210505\";\"20210505\";\"170000\";\"01.02.43\";\"\";\""))
    using (var csv = new CsvReader(reader, config))
    {
        var records = csv.GetRecords<dynamic>().Dump();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    相关资源
    最近更新 更多