Как подготовить файл (добавить вверху) - PullRequest
12 голосов
/ 31 марта 2011

Представьте, что у вас есть файл

sink("example.txt")
data.frame(a = runif(10), b = runif(10), c = runif(10))
sink()

и вы хотите добавить некоторую информацию заголовка, например

/* created on 31.3.2011 */
/* author */
/* other redundant information */

Как бы я добавил этот "заголовок"?Делать это вручную кажется тривиальным.Нажмите несколько Вводов, скопируйте / вставьте или напишите информацию, и все готово.Конечно, в R я мог прочитать example.txt, создать example2.txt, добавить информацию заголовка и затем example.txt.

Мне было интересно, есть ли другой способ добавления файлов "сверху".Другие решения (от c ++ или Java ...) также приветствуются (мне любопытно, как другие языки подходят к этой проблеме).

Ответы [ 8 ]

7 голосов
/ 31 марта 2011

в R нет необходимости работать с дополнительным файлом.Вы можете просто сделать:

writeLines(c(header,readLines(File)),File)

Тем не менее, использование оболочки linux кажется наиболее оптимальным решением, поскольку R не славится производительным чтением и записью файлов.Тем более что вам не нужно сначала читать весь файл.

Пример:

Lines <- c(
"First line",
"Second line",
"Third line")
File <- "test.txt"
header <- "A line \nAnother line \nMore line \n\n"

writeLines(Lines,File)
readLines(File)    

writeLines(c(header,readLines(File)),File)
readLines(File)
unlink(File)
6 голосов
/ 31 марта 2011

Это просто в оболочке Linux:

echo 'your additional header here' >> tempfile
cat example.tst >> tempfile
mv tempfile example
rm tempfile
5 голосов
/ 31 марта 2011

На любом языке есть только одно решение.И это перезаписать весь файл:

contents = readAllOf("example.txt")

overwrite("example.txt", header + contents )
2 голосов
/ 31 марта 2011

В C ++, если вы хотите испачкать руки, вы можете предпринять следующие шаги.

  1. Поток нового контента во временный буфер (чтобы вы знали точный размер нового контента)
  2. Изменить размер файла (truncate(), ftruncate()), чтобы включить текущий размер плюс новый размер
  3. Отобразить весь файл в
  4. memmove() исходный размер файла на новую позицию, который является новым размером содержимого
  5. Скопировать новые данные в позицию 0.

Вероятно, меньше усилий:

  1. Создайте новый файл и вставьте новый контент в
  2. Прочитать старый файл и вставить его тоже
  3. Вызовите вызовы операционной системы, чтобы переместить новый файл в старый файл
2 голосов
/ 31 марта 2011

Либо (A) Прочитайте файл, добавьте свой заголовок и напишите обратно (как предложил Гарет) .. или (B) Кэшируйте то, что вы хотите, записать в файл где-нибудь и записывать все это только тогда, когдасгенерировал ваш заголовок.

1 голос
/ 31 марта 2011

В большинстве файловых систем вы не можете развернуть файл в обратном направлении.

Обычно при сохранении файла существующие данные полностью перезаписываются.Даже если вы измените только первые две строки файла с 1 000 000 строк, приложение обычно перезаписывает неизмененные строки на диск при нажатии кнопки сохранения.

Для большинства форматов файлов любые заголовки имеют фиксированный размер, поэтомуизменить их не проблема.

Существуют также форматы, основанные на потоке;поскольку данные анализируются из потока и используются для создания документа, поток может содержать инструкцию для вставки некоторых данных в начало результирующего документа.Эти потоковые форматы файлов довольно сложны.

0 голосов
/ 09 апреля 2015

В R, после оригинального вопроса:

df <- data.frame(a = runif(10), b = runif(10), c = runif(10))
txt <- "# created on 31.3.2011 \n# author \n# other redundant information"
write(txt, file = "example.txt") 
write.table(df, file = "example.txt", row.names = FALSE, append = TRUE)

Решение, предоставленное Joris Meys, не работает должным образом, перезаписывает содержимое, не добавляя заголовок в строки. Рабочая версия будет:

Lines <- c("First line", "Second line", "Third line")
File <- "test.txt"
header <- "A line \nAnother line \nMore line \n\n"
writeLines(Lines, File)
txt <- c(header, readLines(File)) 
writeLines(txt, File) # Option1
readLines(File) 

Вместо writeLines мы могли бы использовать также:

write(txt, File) # Option 2
cat(txt, sep="\n", File) # Option 3
0 голосов
/ 31 марта 2011

Использование bash:

$ cat > license << EOF
> /* created on 31.3.2011 */
> /* author */
> /* other redundant information */
> EOF
$ sed -i '1i \\' example.txt
$ sed -i '1 {
>    r license
>    d }' example.txt

Не знаю, как это сделать с помощью одной команды sed (sed -i -e '1i \\' -e '1 { ... вставляет после первой строки).

...