Создайте массив (или, если хотите, коллекцию) Readers / InputStreams, по одному для каждого CSV-файла.
По аналогии с идеей @JustinKSU, создайте TreeMap, где ключ - одна строка изфайл CSV.Передайте пользовательский компаратор, ваш собственный impl, который сортирует по длине, дате и т. Д. Значением является индекс (вероятно, целое число, который может быть именем файла, если ваша коллекция является картой) того файла в вашем массиве / коллекции.
Заполните TreeMap, прочитав первую строку из каждого файла.
Удалите нижнюю строку, используя TreeMap.pollFirstEntry (), и запишите ключ (строку) в Writer / OutputStream.Используйте значение, чтобы прочитать еще одну строку из соответствующего файла (проверка на EOF) и добавить ее в TreeMap.
Повторять до тех пор, пока TreeMap не станет пустым.Закройте все.
Редактировать - ниже добавлен исходный код
И обратите внимание, это работает, только если входные файлы уже отсортированы !(Как было указано в вопросе)
public void mergeSort(File[] inFiles, File outFile, Comparator<String> comparator) throws IOException {
try {
BufferedReader[] readers = new BufferedReader[inFiles.length];
PrintWriter writer = new PrintWriter(outFile);
TreeMap<String, Integer> treeMap = new TreeMap<String, Integer>(
comparator);
// read first line of each file. We don't check for EOF here, probably should
for (int i = 0; i < inFiles.length; i++) {
readers[i] = new BufferedReader(new FileReader(inFiles[i]));
String line = readers[i].readLine();
treeMap.put(line, Integer.valueOf(i));
}
while (!treeMap.isEmpty()) {
Map.Entry<String, Integer> nextToGo = treeMap.pollFirstEntry();
int fileIndex = nextToGo.getValue().intValue();
writer.println(nextToGo.getKey());
String line = readers[fileIndex].readLine();
if (line != null)
treeMap.put(line, Integer.valueOf(fileIndex));
}
}
finally {
// close everything here...
}
}