【问题标题】:How to output JSON array as a single field in CSV using ChoETL如何使用 ChoETL 将 JSON 数组输出为 CSV 中的单个字段
【发布时间】:2020-06-25 19:23:50
【问题描述】:

我正在使用 ChoETL 将 JSON 转换为 CSV。目前,如果 JSON 对象中的属性是一个数组,它将被输出到 JSON 中的单独字段中。 示例:

{
    "id", 1234,
    "states": [
        "PA",
        "VA"
     ]
},
{
    "id", 1235,
    "states": [
        "CA",
        "DE",
        "MD"
     ]
},

这会产生这样的 CSV(使用管道作为分隔符)

"id"|"states_0"|"states_1"|"states_2"
"1234"|"PA"|"VA"
"1235"|"CA"|"DE"|"MD"

我希望数组在单个状态字段中显示为逗号分隔的字符串

"id"|"states"
"1234"|"PA,VA"
"1235"|"CA,DE,MD"

这是我用来执行解析和转换的代码。

public static class JsonCsvConverter
{
    public static string ConvertJsonToCsv(string json)
    {
        var csvData = new StringBuilder();
        using (var jsonReader = ChoJSONReader.LoadText(json))
        {
            using (var csvWriter = new ChoCSVWriter(csvData).WithFirstLineHeader())
            {
                csvWriter.WithMaxScanRows(1000);
                csvWriter.Configuration.Delimiter = "|";
                csvWriter.Configuration.QuoteAllFields = true;
                csvWriter.Write(jsonReader);
            }
        }

        return csvData.ToString();
    }
}

已编辑:删除了无用的测试代码

【问题讨论】:

    标签: c# json csv choetl


    【解决方案1】:

    这就是您可以使用以下代码生成预期输出的方式

    var csvData = new StringBuilder();
    using (var jsonReader = ChoJSONReader.LoadText(json))
    {
        using (var csvWriter = new ChoCSVWriter(csvData)
            .WithFirstLineHeader()
            .WithDelimiter("|")
            .QuoteAllFields()
            .Configure(c => c.UseNestedKeyFormat = false)
            .WithField("id")
            .WithField("states",  m => m.ValueConverter(o => String.Join(",", ((Array)o).OfType<string>())))
            )
        {
            csvWriter.Write(jsonReader);
        }
    }
    
    Console.WriteLine(csvData.ToString());
    

    输出:

    id|states
    "1234"|"PA,VA"
    "1235"|"CA,DE,MD"
    

    PS:下个版本,这个问题会自动处理,不使用valueconverters

    【讨论】:

    • 谢谢,我使用您的代码“System.InvalidCastException: 'Unable to cast object of type 'ChoETL.ChoDynamicObject' to type 'System.Array'.'” 但这让我失望了使用此代码将数据转换为字符串的路径 .WithField("states", valueConverter: o => o == null? "" : String.Join(",", (o as ChoDynamicObject)["states"] .ConvertToFlattenObject())) 如果您更新答案,我会将其标记为解决方案。在 JSON 结构未知的情况下,有没有办法不必对字段进行硬编码或预先分析 JSON 对象?
    • 将值转换器分配给字段存在错误。对代码进行了调整以分配转换器。看看我上面的更新,
    • 关于您的问题Is there any way to not have to hard code the fields or pre-analyze the JSON objects for times when the JSON structure isn't known?。 Yes 将在下一个版本中自动处理。
    猜你喜欢
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2019-10-25
    相关资源
    最近更新 更多