Используйте библиотеку Java big-sorter , которая публикуется в Maven Central и имеет необязательную зависимость от commons-csv для обработки CSV. Он обрабатывает файлы любого размера, разбивая их на промежуточные файлы, сортируя промежуточные файлы и объединяя их.
Вот пример:
Учитывая файл CSV ниже, мы будем сортировать по второму столбцу (столбец «число»):
name,number,cost
WIPER BLADE,35,12.55
ALLEN KEY 5MM,27,3.80
Serializer<CSVRecord> serializer = Serializer.csv(
CSVFormat.DEFAULT
.withFirstRecordAsHeader()
.withRecordSeparator("\n"),
StandardCharsets.UTF_8);
Comparator<CSVRecord> comparator = (x, y) -> {
int a = Integer.parseInt(x.get("number"));
int b = Integer.parseInt(y.get("number"));
return Integer.compare(a, b);
};
Sorter
.serializer(serializer)
.comparator(comparator)
.input(inputFile)
.output(outputFile)
.sort();
Результат:
name,number,cost
ALLEN KEY 5MM,27,3.80
WIPER BLADE,35,12.55
Я создал CSV-файл с 12 миллионами строк и 37 столбцами и заполнил сетку случайными целыми числами от 0 до 100 000. Затем я отсортировал файл объемом 2,7 ГБ в 11-м столбце, используя big-sorter , и потребовалось 8 минут , чтобы выполнить однопоточность на i7 с твердотельным накопителем и максимальной кучей, установленной на 512 м (-Xmx512m
).
Подробнее см. Проект README .