【问题标题】:CsvHelper - Custom parser for a certain columnCsvHelper - 特定列的自定义解析器
【发布时间】:2021-01-22 17:53:33
【问题描述】:

是否有一种好方法可以覆盖对某个列/字段的解析,即对于包含 json 对象的格式不正确的文档。流读取 json 并因此将流向前移动到不正确/格式错误的 csv 字段,但也保存/返回 json。

最好结合 CsvDataReader 和 DataTable.Load

编辑 - 澄清示例:
col_a;col_b;col_c;col_json
0.0;-1;0;{"t": 1598270895, "text": "hello world" }

【问题讨论】:

  • JSON 字段是否正确转义?意思是,它周围包含"s,并且里面的任何"都像""一样加倍?
  • 你有一些示例数据吗?
  • 没有不转义 - 但可以用 json 解析:概念上:0.0;-1;0;{"t": 1598270895, "text": "hello world" } 但文本可能更糟里面有换行符或分号 - 一个更复杂的 json 但这无关紧要。是否可以覆盖一个字段

标签: csvhelper


【解决方案1】:

我认为这应该行不通,但我确实发现仅设置 BadDataFound = null 与最新版本的 CsvHelper 和您的示例数据一起使用。

但是,如果“文本”中有换行符或分号,则它不起作用。

void Main()
{
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        BadDataFound = null,
        Delimiter = ";"
    };
    using(var reader = new StringReader("col_a;col_b;col_c;col_json\n0.0;-1;0;{\"t\": 1598270895, \"text\": \"hello world\"}"))
    using(var csv = new CsvReader(reader, config))
    {
        using (var dr = new CsvDataReader(csv))
        {
            var dt = new DataTable();
            dt.Load(dr);
            dt.Dump();
        }
    }
}

【讨论】:

  • 很好很有趣 - 但如果可以像“阅读器”列一样覆盖并以某种方式同步/向前移动位置读取流会更好。
  • 我没有看到任何使用 CsvHelper 的方法。即使您手动使用 Read() 引入每一行,如果 json 没有正确转义,如果 json 中有分号或换行符,CsvHelper 也不会正确读取整行。我能看到它工作的唯一方法是,如果你能以某种方式为该列添加一个 json 解析器。
  • 希望有一种方法可以在幸运的情况下将其连接起来......覆盖列流读取的读取并确保所有指针/流位置对齐。
猜你喜欢
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 2017-04-23
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多