12

假设你有一个文件

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

并且想要添加一些标题信息,例如

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

我将如何添加这个“标题”?手动操作似乎微不足道。点击几个 Enter,复制/粘贴或写入信息,您就完成了。当然,在 R 中,我可以读入example.txt、创建example2.txt、添加标题信息,然后example.txt.

我想知道是否有另一种从“顶部”附加文件的方法。也欢迎其他解决方案(来自 c++ 或 Java ...)(我很好奇其他语言如何解决这个问题)。

4

8 回答 8

7

在 R 中,不需要使用额外的文件。你可以这样做:

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

然而,使用 linux shell 似乎是最理想的解决方案,因为 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)
于 2011-03-31T13:42:53.907 回答
6

在 linux shell 中这很容易:

echo 'your additional header here' >> tempfile
cat example.tst >> tempfile
mv tempfile example
rm tempfile
于 2011-03-31T13:26:17.917 回答
5

在任何语言中,最终只有一个解决方案。那就是覆盖整个文件:

contents = readAllOf("example.txt")

overwrite("example.txt", header + contents )
于 2011-03-31T13:24:33.113 回答
2

要么(A)读入文件,在之前添加标题并写回(如Gareth建议的那样)..或(B)将您想要写入文件的内容缓存到某处,只有在您生成标题时才将其全部写出.

于 2011-03-31T13:28:13.943 回答
2

在 C++ 中,如果您愿意亲自动手,可以采取以下步骤。

  1. 将新内容流式传输到临时缓冲区(因此您知道新内容的确切大小)
  2. 调整文件大小 ( truncate(), ftruncate()) 以包括当前大小和新大小
  3. 将整个文件映射到
  4. memmove()原始文件大小到新位置,即新内容大小
  5. 复制位置 0 处的新数据。

可能更省力:

  1. 构建一个新文件并将新内容推送进去
  2. 读取旧文件并将其也推入
  3. 调用操作系统调用将新文件移动到旧文件
于 2011-03-31T13:35:48.930 回答
1

大多数文件系统通常不能向后扩展文件。

通常,当您保存文件时,现有数据会被完全覆盖。即使您只更改了 1,000,000 行文件的前两行,应用程序通常也会在您点击保存时将未更改的行重新写入磁盘。

对于大多数文件格式,任何标题都是固定大小的,因此更改它们不是问题。

还有一些基于流的格式;由于数据是从流中解析并用于构造文档,因此流可能包含在结果文档的开头插入一些数据的指令。不过,这些基于流的文件格式相当复杂。

于 2011-03-31T13:26:52.727 回答
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 { ...在第一行之后插入)。

于 2011-03-31T14:02:04.933 回答
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。一个工作版本是:

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
于 2015-04-09T20:42:07.843 回答