【问题标题】:How I write all values of array using ChoCSVWriter of Cinchoo ETL?如何使用 Cinchoo ETL 的 ChoCSVWriter 写入数组的所有值?
【发布时间】:2021-07-05 17:08:33
【问题描述】:

在写入 CSV 文件时,它没有值 redsmall

例子:

输入json文件:

[
  {
    "id": 1,
    "name": "Mike",
    "features": {
      "colors": [
        "blue"
      ],
      "sizes": [
        "big"
      ]
    }
  },
  {
    "id": 1,
    "name": "Jose",
    "features": {
      "colors": [
        "blue",
        "red"
      ],
      "sizes": [
        "big",
        "small"
      ]
    }
  }
]

输出 csv 文件:

id;name;features_colors_0;features_sizes_0
1;Mike;blue;big
1;Jose;blue;big

代码:

using ChoETL;
using System.IO;

namespace TestJsonToCsv
{
    class Program
    {
        static void Main(string[] args)
        {
            var jsonPath = @"C:\Users\xxx\Downloads\test_array.json";
            var csvPath = Path.ChangeExtension(jsonPath, "csv");

            var config = new ChoJSONRecordConfiguration();
            config.Encoding = System.Text.Encoding.UTF8;

            using (var r = new ChoJSONReader(jsonPath, config))
            {
                using (var w = new ChoCSVWriter(csvPath).WithFirstLineHeader())
                {
                    w.Write(r);
                }
            }
        }
    }
}

库版本:
ChoETL - 1.2.1.14
ChoETL.JSON - 1.2.1.14
问题参考 - https://github.com/Cinchoo/ChoETL/issues/138

【问题讨论】:

    标签: c# json .net csv choetl


    【解决方案1】:

    您必须指示作者使用WithMaxScanRows 扫描节点以发现大小

    这是工作示例

    string json = @"
    [
      {
        ""id"": 1,
        ""name"": ""Mike"",
        ""features"": {
          ""colors"": [
            ""blue""
          ],
          ""sizes"": [
            ""big""
          ]
        }
      },
      {
        ""id"": 1,
        ""name"": ""Jose"",
        ""features"": {
          ""colors"": [
            ""blue"",
            ""red""
          ],
          ""sizes"": [
            ""big"",
            ""small""
          ]
        }
      }
    ]";
    
    StringBuilder csv = new StringBuilder();
    
    using (var r = ChoJSONReader.LoadText(json))
    {
        using (var w = new ChoCSVWriter(csv)
            .WithFirstLineHeader()
            .WithMaxScanRows(2)
            .ThrowAndStopOnMissingField(false)
            )
        {
            w.Write(r);
        }
    }
    Console.WriteLine(csv.ToString());
    

    输出:

    id,name,features_colors_0,features_colors_1,features_sizes_0,features_sizes_1
    1,Mike,blue,,big,
    1,Jose,blue,red,big,small
    

    【讨论】:

    • 这种方法不会记录所有对象。在您的示例中,您没有编写第一个对象“名称:迈克”
    • 请在 writer 上使用 .ThrowAndStopOnMissingField(false) 来忽略缺失的字段。更新了上面的代码。
    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多