Подтвердить что ты не робот

Как добавить файл (добавить вверху)

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

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.

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

4b9b3361

Ответ 1

в 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)

Ответ 2

В оболочке linux совершенно легко:

echo 'your additional header here' >> tempfile
cat example.tst >> tempfile
mv tempfile example
rm tempfile

Ответ 3

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

contents = readAllOf("example.txt")

overwrite("example.txt", header + contents )

Ответ 4

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

Ответ 5

В С++, если вы готовы заразиться руками, вы можете сделать следующие шаги.

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

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

  • Создайте новый файл и нажмите новое содержимое в
  • Прочитайте старый файл и нажмите его слишком.
  • Вызовите вызовы операционной системы, чтобы переместить новый файл в старый файл

Ответ 6

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

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

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

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

Ответ 7

Использование 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 { ... вставляет после первой строки).

Ответ 8

В 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