Преобразование JSON в CSV с использованием CHOETL, отображающее значения в одной строке, а не в столбцах
Я конвертирую файл JSON в файл CSV. JSON имеет несколько вложенных объектов. При конвертации я могу вывести все значения из JSON в CSV. Однако все значения отображаются в виде одной строки с одним и тем же заголовком, повторяющимся несколько раз. Я использую библиотеку CHOETL.
using (var csv = new ChoCSVWriter("file1.csv").WithFirstLineHeader().WithDelimiter(","))
{
using (var json = new ChoJSONReader("file2.json")
.WithField("RecordID", jsonPath: "$..Events[*].RecordId")
.WithField("RecordType", jsonPath: "$..Events[*].RecordType")
.WithField("EventDate", jsonPath: "$..Events[*].EventDate")
{
csv.Write(json);
}
}
Показывает результаты как
- Запись ID_0 Запись ID_1 Запись ID_2
- 123 456 789
А не как
- ID записи
- 123
- 456
- +789
Вот файл JSON
[
{
"Id": "3e399241",
"IdLineage": [
"sfdsfdsfs",
"sdfdsfdsf"
],
"Individuals": [
{
"Id": "1232112",
"IdLineage": [
"fdsfsd1"
],
"Events": [
{
"RecordId": "2132121321",
"RecordType": "SALE",
"EventDate": "2016-01-04T05:00:00Z"
},
{
"RecordId": "123213212",
"RecordType": "SALE",
"EventDate": "2012-07-16T04:00:00Z"
}
]
},
{
"Id": "ssf2112",
"IdLineage": [],
"Events": [
{
"RecordId": "123213ds21",
"RecordType": "ACXIOMRECORD",
"EventDate": "2017-12-17T03:33:54.875Z"
}
]
},
{
"Id": "asadsad",
"IdLineage": [],
"Events": [
{
"RecordId": "213213sa21",
"RecordType": "SALE",
"EventDate": "2018-03-09T05:00:00Z"
}
]
}
]
}
]
1 ответ
На основе размещенного вами примера кода вы создаете объект из JSON, как показано ниже
{
RecordID : Array,
RecordType: Array,
EventDate: Array
}
Это приводит к генерации CSV в следующем формате, как и ожидалось.
RecordID_0, RecordID_1, RecordID_2, RecordType_0, RecordType_1, ....
Если вы хотите создать CSV в следующем формате, вам нужно будет зафиксировать путь json в каждом поле записи
RecordID, RecordType, EventData
образец кода
using (var csv = new ChoCSVWriter("file1.csv").WithFirstLineHeader().WithDelimiter(","))
{
using (var json = new ChoJSONReader("file2.json")
.WithField("RecordID", jsonPath: "$..Events.RecordId")
.WithField("RecordType", jsonPath: "$..Events.RecordType")
.WithField("EventDate", jsonPath: "$..Events.EventDate")
{
csv.Write(json);
}
}
ОБНОВЛЕНИЕ № 1: Посмотрев пример JSON, вы можете извлечь данные и создать CSV-файл в ожидаемом формате.
StringBuilder msg = new StringBuilder();
using (var w = new ChoCSVWriter(msg)
.WithFirstLineHeader()
)
{
using (var r = new ChoJSONReader("Sample32.json")
.WithJSONPath("$..Events[*]")
)
{
w.Write(r);
}
}
Console.WriteLine(msg.ToString());
ВЫХОД № 1:
RecordId,RecordType,EventDate
2132121321,SALE,1/4/2016 5:00:00 AM
123213212,SALE,7/16/2012 4:00:00 AM
123213ds21,ACXIOMRECORD,12/17/2017 3:33:54 AM
213213sa21,SALE,3/9/2018 5:00:00 AM
ОБНОВЛЕНИЕ № 2:
Вы должны использовать Linq для объединения идентификаторов с участниками события. Пример ниже показывает, как
using (var fw = new StreamWriter("Sample32.csv", true))
{
using (var w = new ChoCSVWriter(fw)
.WithFirstLineHeader()
)
{
using (var r = new ChoJSONReader("Sample32.json")
.WithJSONPath("$..Individuals[*]")
)
{
w.Write(r.SelectMany(r1 => ((dynamic[])r1.Events).Select(r2 => new { r1.Id, r2.RecordId, r2.RecordType, r2.EventDate })));
}
}
}
Console.WriteLine(File.ReadAllText("Sample32.csv"));
ВЫХОД № 2:
Id,RecordId,RecordType,EventDate
1232112,2132121321,SALE,1/4/2016 5:00:00 AM
1232112,123213212,SALE,7/16/2012 4:00:00 AM
ssf2112,123213ds21,ACXIOMRECORD,12/17/2017 3:33:54 AM
asadsad,213213sa21,SALE,3/9/2018 5:00:00 AM