univocity-parsers поддерживает выбор полей и может сделать это очень легко.Это также быстрее, чем используемая вами библиотека.
Вот как вы можете использовать ее для выбора интересующих колонок:
Ввод
String input = "X, X2, Symbol, Date, Open, High, Low, Close, Volume\n" +
" 5, 9, AAPL, 01-Jan-2015, 110.38, 110.38, 110.38, 110.38, 0\n" +
" 2710, 289, AAPL, 01-Jan-2015, 110.38, 110.38, 110.38, 110.38, 0\n" +
" 5415, 6500, AAPL, 02-Jan-2015, 111.39, 111.44, 107.35, 109.33, 53204600";
Настройка
CsvParserSettings settings = new CsvParserSettings(); //many options here, check the tutorial
settings.setHeaderExtractionEnabled(true); //tells the parser to use the first row as the header row
settings.selectFields("X", "X2"); //selects the fields
Анализ и печать результатов
CsvParser parser = new CsvParser(settings);
for(String[] row : parser.iterate(new StringReader(input))){
System.out.println(Arrays.toString(row));
}
}
Вывод
[5, 9]
[2710, 289]
[5415, 6500]
При выборе поля можно использовать любую последовательность полей и иметь строки с различными размерами столбцов, а такжеПарсер справится с этим просто отлично.Не нужно писать сложную логику, чтобы справиться с этим.
Обработайте File
в вашем коде, измените приведенный выше пример, чтобы сделать это:
for(String[] row : parser.iterate(new File(filePath))){
... //your logic goes here.
}
Если вы хотите более полезную запись(с введенными значениями), используйте это вместо:
for(Record record : parser.iterateRecords(new File(filePath))){
... //your logic goes here.
}
Ускорение
Самый быстрый способ обработки файла через RowProcessor
.Это обратный вызов, который получил строки, проанализированные с входных данных:
settings.setProcessor(new AbstractRowProcessor() {
@Override
public void rowProcessed(String[] row, ParsingContext context) {
System.out.println(Arrays.toString(row));
context.skipLines(3); //use the context object to control the parser
}
});
CsvParser parser = new CsvParser(settings);
//`parse` doesn't return anything. Rows go to the `rowProcessed` method.
parser.parse(new StringReader(input));
Вы должны иметь возможность довольно быстро анализировать очень большие файлы.Если что-то замедляется, посмотрите в своем коде (избегайте добавления значений в списки или коллекции в памяти или, по крайней мере, предварительно выделяйте коллекции хорошего размера и предоставьте JVM большой объем памяти для работы с использованием флагов Xms и Xmx).
Сейчас этот парсер самый быстрый из всех, что вы можете найти.Я сделал это сравнение производительности некоторое время назад, вы можете использовать для справки.
Надеюсь, это поможет
Раскрытие информации: я являюсь автором этой библиотеки.Это с открытым исходным кодом и бесплатно (лицензия Apache V2.0)