Если вы чувствуете себя авантюрно, я строю поддержку вложенных элементов в CSV в uniVocity-parsers.
Версия 2.0.0-SNAPSHOT поддерживает разбор вложенных бобов с аннотациями. Мы планируем выпустить финальную версию через пару недель. Поддержка написания еще не реализована, так что вам придется делать вручную (это должно быть довольно легко с использованием текущего API).
Разбор такой структуры сложнее, но в большинстве случаев анализатор работает нормально. Взгляните на этот тестовый пример:
Input CSV:
1,Foo
Account,23234,HSBC,123433-000,HSBCAUS
Account,11234,HSBC,222343-130,HSBCCAD
2,BAR
Account,1234,CITI,213343-130,CITICAD
Обратите внимание, что первый столбец каждой строки указано, какой компонент будет читаться. Как "Клиент" в CSV совпадает с именем класса, вам не нужно аннотировать
Pojos
enum ClientType {
PERSONAL(2),
BUSINESS(1);
int typeCode;
ClientType(int typeCode) {
this.typeCode = typeCode;
}
}
public static class Client {
@EnumOptions(customElement = "typeCode", selectors = { EnumSelector.CUSTOM_FIELD })
@Parsed(index = 0)
private ClientType type;
@Parsed(index = 1)
private String name;
@Nested(identityValue = "Account", identityIndex = 0, instanceOf = ArrayList.class, componentType = ClientAccount.class)
private List<ClientAccount> accounts;
}
public static class ClientAccount {
@Parsed(index = 1)
private BigDecimal balance;
@Parsed(index = 2)
private String bank;
@Parsed(index = 3)
private String number;
@Parsed(index = 4)
private String swift;
}
код для разбора на вход
public void parseCsvToBeanWithList() {
final BeanListProcessor<Client> clientProcessor = new BeanListProcessor<Client>(Client.class);
CsvParserSettings settings = new CsvParserSettings();
settings.getFormat().setLineSeparator("\n");
settings.setRowProcessor(clientProcessor);
CsvParser parser = new CsvParser(settings);
parser.parse(new StringReader(CSV_INPUT));
List<Client> rows = clientProcessor.getBeans();
}
Если вы нашли любая проблема с использованием синтаксического анализатора, пожалуйста, отправьте обновление this issue
Как насчет этих столбцов: OrderNo, OrderNa me, Цена, OrderLineNo, OrderLinePrice, ItemNo, ItemName, ItemDescription? Или я что-то упускаю? – Benj
Вы правы, но что, если есть несколько OrderLines и Items? – user932205
Вам нужно будет дублировать много данных, если вы хотите простую плоскую структуру. –