如何预置到文件(在顶部添加)

想象一下你有一个文件

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 …)也欢迎(我很好奇其他语言如何解决这个问题)。

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

在linux shell中它非常简单:

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

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

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

要么(A)读入文件,在之前添加标题并写回(如Gareth建议的那样)..或(B)缓存你想要写入文件的地方,只有当你生成标题时才写出来。

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

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

它可能不那么努力:

  1. 构造一个新文件并推送新内容
  2. 阅读旧文件并将其推入
  3. 调用操作系统调用将新文件移动到旧文件

您通常无法使用大多数文件系统向后扩展文件。

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

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

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

使用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 { ...在第一行之后插入)。

在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