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

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

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 ...) также приветствуются (мне любопытно, как другие языки подходят к этой проблеме).

12 голосов | спросил Roman Luštrik 31 MarpmThu, 31 Mar 2011 17:21:14 +04002011-03-31T17:21:14+04:0005 2011, 17:21:14

8 ответов


0

в 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)
ответил Joris Meys 31 MarpmThu, 31 Mar 2011 17:42:53 +04002011-03-31T17:42:53+04:0005 2011, 17:42:53
0

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

echo 'your additional header here' >> tempfile
cat example.tst >> tempfile
mv tempfile example
rm tempfile
ответил tgmath 31 MarpmThu, 31 Mar 2011 17:26:17 +04002011-03-31T17:26:17+04:0005 2011, 17:26:17
0

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

contents = readAllOf("example.txt")

overwrite("example.txt", header + contents )
ответил Gareth Davis 31 MarpmThu, 31 Mar 2011 17:24:33 +04002011-03-31T17:24:33+04:0005 2011, 17:24:33
0

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

ответил Jon Cage 31 MarpmThu, 31 Mar 2011 17:28:13 +04002011-03-31T17:28:13+04:0005 2011, 17:28:13
0

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

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

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

  1. Создайте новый файл и поместите новый контент в
  2. Прочитайте старый файл и вставьте его тоже
  3. Вызовите вызовы операционной системы, чтобы переместить новый файл в старый файл
ответил Nim 31 MarpmThu, 31 Mar 2011 17:35:48 +04002011-03-31T17:35:48+04:0005 2011, 17:35:48
0

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

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

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

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

ответил Collin Dauphinee 31 MarpmThu, 31 Mar 2011 17:26:52 +04002011-03-31T17:26:52+04:0005 2011, 17:26:52
0

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

ответил max taldykin 31 MarpmThu, 31 Mar 2011 18:02:04 +04002011-03-31T18:02:04+04:0006 2011, 18:02:04
0

В 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
ответил mpalanco 9 PMpThu, 09 Apr 2015 23:42:07 +030042Thursday 2015, 23:42:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132