Парсер Univocity CSV для нескольких bean-компонентов с несколькими строками в одном CSV

Учитывая следующие классы

public class Inventory {
    private InventoryHeader header;
    private List<InventoryLine> lines;
}

public class InventoryHeader {
    private String date;
    private boolean isCurrent;
}


public class InventoryLine {
    private String itemName;
    private int quantity;
}

и следующий CSV (используя ',' в качестве разделителя, но для наглядности я использовал здесь пробелы):

IH    2007-06-05    false
IL    Watch         7
IL    Flower Pot    9
IL    Chicken Wing  29
IH    2010-07-30    true
IL    Cable         200
IL    Fish Tank     87

В этом случае «IH» означает, что эта строка является заголовком запасов, а «IL» означает, что это строка запасов. Строки строки запасов, следующие за заголовком запаса, относятся только к этому запасу. Конец объекта Inventory обозначается либо новой строкой заголовка инвентаризации, либо концом файла.

Я хотел бы разобрать это в список. Анализ одного объекта Inventory прост, просто добавьте ValueSwitch в столбец 0, создайте BeanListProcessor для InventoryHeader и InventoryLine и просто добавьте результаты в новый объект Inventory.

С помощью описанного выше метода мы получим список заголовков и строк, но как узнать, какие строки каким заголовкам соответствуют?


person user2827048    schedule 16.08.2018    source источник


Ответы (1)


Автор библиотеки здесь. Проверьте этот пример, так как он очень похож на ваш случай.

Вам нужно переопределить метод rowProcessorSwitched вашего InputValueSwitch, чтобы знать, когда синтаксический анализатор начинает обрабатывать другой формат строки.

Что-то вроде этого:

public void rowProcessorSwitched(RowProcessor from, RowProcessor to) {
    if(from == inventoryLineProcessor){ // stopped processing inventory lines and will process some other row.
        List<InventoryLine> inventoryLines = inventoryLineProcessor.getBeans();

        //now assign a copy of this list to the last InventoryHeader you have
    }
}

Надеюсь это поможет.

person Jeronimo Backes    schedule 22.08.2018