Сортировка файла с разделителями табуляции на основе столбца в Java - PullRequest
0 голосов
/ 23 февраля 2012

У меня огромный (приблизительно 4 ГБ) текстовый файл, который нужно было отсортировать.Он настолько велик, что в нем 6 тысяч кумов и тысячи рядов.Это очень легко отсортировать с помощью скрипта bash.Тем не менее, мне нужна кроссплатформенная Java-программа для сортировки файла.Я использовал this , но получил тот же файл результатов, что и отсортированный выходной файл.

Часть входного файла для сортировки

SNP_ID  Sub_0001    Sub_0002    Sub_0003    Sub_0004 ...
cnv3p502    0   0   0   0
rs3115860   1   0   1   1        
rs3131967   1   0   1   1        
rs3115850   1   0   1   1
rs12124819  0   0   0   0
rs2519031   1   0   1   1   
.
.
.  

Мне нужно отсортировать этот файл с разделителями табуляции относительно первого столбца в Java без использования системных команд, которые выполняют команды Unix.Я буду признателен за вашу помощь.

1 Ответ

0 голосов
/ 24 февраля 2012

Как сказано в комментарии Дхрува, один из возможных подходов - использовать внешнюю сортировку.

Что вы хотели бы сделать, это создать объект, который инкапсулирует каждую строку вашего файла, и создать собственный компаратор, который сортируетпо критериям, которые вам нужны.Помните, что вам не нужно сопоставлять каждый столбец в строке со свойством Object, вы можете просто иметь свойство, содержащее первый столбец каждой строки, для использования в качестве свойства сравнения, и другое свойство, содержащее всю строку.

Загрузка фрагмента файла строка за строкой в ​​коллекцию указанного типа объекта.Сортируйте это, используя ваш собственный компаратор.Запишите коллекцию во временный файл.Повторяйте до конца исходного файла.

В итоге вы получите несколько файлов меньшего размера, отсортированных по отдельности.Теперь вы используете шаг «слияния» внешней сортировки, чтобы создать новый файл, содержащий все отсортированные строки.Прочитайте первую строку каждого файла, запишите наименьшую из них в отсортированный файл, прочитайте новую строку из файла, который имел наименьшую.Повторяйте, пока все временные файлы не станут пустыми.

Готово.

...