如何使用 ChoETL 将 JSON 数组输出为 CSV 中的单个字段
How to output JSON array as a single field in CSV using ChoETL
我正在使用 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();
}
}
已编辑:删除了无用的测试代码
这是使用以下代码生成预期输出的方法
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
的情况下自动处理
我正在使用 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();
}
}
已编辑:删除了无用的测试代码
这是使用以下代码生成预期输出的方法
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
的情况下自动处理