我需要解析一个CSV文件,其中包含1个头记录(无名称),一对多的详细记录和一个尾部记录,如下所示(input.csv),需要将其转换为output.json格式。
我使用下面的opencsv库将记录读入字符串数组列表,其中列表中的每个字符串数组代表1条记录。
opencsv中还提供了一个bean映射,但是它不具有将标头记录映射到单独的Bean,将详细信息记录映射到单独的bean阵列以及将尾部记录映射到另一个单独的bean的功能。
http://opencsv.sourceforge.net/#reading_without_annotations_column_positions
因此,我现在很想从CSV中生成带有标题,多个详细信息和一个尾部记录的Json。
有人可以分享一些想法来实现这一目标吗?
input.csv
1,,,
2,DC PIV REL11,D6,
2,DC PIV REL12,ADDED VIA SFTP12,
2,D6,ADDED VIA SFTP6,
3,123,END
output.json
{
"header": {
"type": "1",
"number": "",
"code": ""
},
{
"contents": {
"content": [
{
"type": "2",
"name": "DC PIV REL11",
"reference": "D6"
},
{
"type": "2",
"name": "DC PIV REL12",
"reference": "ADDED VIA SFTP12"
},
{
"type": "2",
"name": "D6",
"reference": "ADDED VIA SFTP6"
}
]
},
{
"tail": {
"type": "3",
"number": "123",
"code": "END"
}
}
答案 0 :(得分:1)
我找到了以下解决方案。
我用适当的getter设置器创建了4个DTO类Root,Header,Contents和Tail,并使用下面的代码解决了这个问题。
请注意,我没有在下面的代码中添加验证逻辑来检查记录是标题,内容还是结尾记录,因为我假设第一个记录是标题结尾,但是一个记录是内容,最后一条记录是结尾。
希望这会有所帮助。
CSVReader reader = new CSVReader(new FileReader(classLoader.getResource("sample_file.txt").getFile()));
List<String[]> records = reader.readAll();
int count = 0;
Header header = new Header();
Contents contents = new Contents();
Tail tail = new Tail();
List<Content> contentList = new ArrayList<Content>();
for (String[] record : records) {
if (count == 0 ) {
header.setRecordType(record[0]);
header.setNumber(record[1]);
header.setCode(record[2]);
} else if (count < (records.size() - 1)) {
Content content = new Content();
content.setRecordType(record[0]);
content.setName(record[1]);
content.setReference(record[2]);
contentList.add(content);
} else {
tail.setRecordType(record[0]);
tail.setNumber(record[1]);
tail.setCode(record[2]);
}
count++;
}
contents.setContent(contentList);
Root root = new Root();
root.setHeader(header);
root.setContents(contents);
root.setTail(tail);