2015-01-14 2 views
0

Скажем, например, у Вас есть CSV-файл с заголовками, которые находятся в нижней части файла, как например:Предпочтительный метод повторного упорядочения файлов CSV по строке в Java

1,2,3,4 
1,2,3,4 
1,2,3,4 
a,b,c,d 

Вы хотите, чтобы изменить порядок его как таковой

a,b,c,d 
1,2,3,4 
1,2,3,4 
1,2,3,4 

У меня в основном есть два способа сделать это. Мне было интересно, что было более эффективным с точки зрения использования памяти. Я подозреваю, что первый случай, но было интересно, были ли разные мнения.

Первый метод:

  • Итерация через файл, пока не дойдете до последней строки, хранить это в переменной.
  • Запись переменной в файл
  • Итерацию через файл, повторяющую каждую строку, за исключением последней.

Второй метод:

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

Меня всегда учили помещать вещи в память (второй способ), когда вам нужно случайным образом получить доступ к переменной в наборе данных (это способ DOM), тогда как если вы просто читаете/записываете файлы чтобы использовать первый способ («SAX» в xml-терминах), я не могу не думать о том, что повторение итерации по набору данных в два раза (первый способ) действительно неаккуратно. Есть ли лучшие способы сделать это?

+0

Я бы предложил просто удалить последнюю строку в файле и добавить строку в существующий файл, но нет простого способа сделать это из моего быстрого поиска в Google. –

ответ

1

В зависимости от размера файла, который вы могли бы сделать это, как этот

static final Charset FILE_ENCODING = StandardCharsets.UTF_8; 

List<String> inLines = Files.readAllLines(Paths.get("input.csv"), FILE_ENCODING); 
inLines.add(0, inLines.get(inLines.size()-1)); 
inLines.remove(inLines.size()-1); 
Files.write(Paths.get("output.csv"), inLines, FILE_ENCODING); 
0

Прочитать файл из потока и записать его в другой поток. Хотя делайте это, не забудьте написать последнюю строку в качестве первой строки. Удалите исходный файл и переименуйте копию в качестве исходного файла.

Для этого вам необходимо сохранить все содержимое первого файла в переменной: String, ArrayList или что-то в этом роде.

Если вы хотите добавить что-то в файл, просто откройте его в режиме дописывания:

new BufferedWriter(new FileWriter(PATH, true)); 

Но это не то, что вы ищете.

+0

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

+0

Если ресурс, который вы хотите сохранить, является памятью за счет процессора, прочитайте файл до конца и сохраните каждую строку всегда в той же строке, перезаписывая ее, чтобы последняя строка была сохранена в этой строке. Теперь создайте новый файл, напишите в качестве первой строки ранее сохраненную строку. Затем снова запустите первый файл и напишите каждую строку (кроме последней) в новый файл. Удалите исходный файл и переименуйте копию в качестве исходного файла. –

0

Я хотел бы попробовать использовать RandomAccessFile: 1. Стремиться к концу. 2. Прочитайте заголовок назад (не поддерживается напрямую, но может выполняться байтом по байту). 3. Напишите заголовок в новый файл. 4. Ищите начало исходного файла (или откройте его снова с помощью FileReader). 5. Итерацию через запись файла в файл результата, за исключением последней строки.

Не уверен, что он быстрее, но может быть.

Смежные вопросы