如何预置到文件(在顶部添加)
想象一下你有一个文件
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 ++中,如果您愿意亲自动手,可以采取以下步骤。
- 将新内容流式传输到临时缓冲区(这样您就知道新内容的确切大小)
- 调整文件大小(
truncate()
,ftruncate()
)以包括当前大小加上新大小 - 映射整个文件
-
memmove()
将原始文件大小设置为新位置,即新内容大小 - 复制位置0的新数据。
它可能不那么努力:
- 构造一个新文件并推送新内容
- 阅读旧文件并将其推入
- 调用操作系统调用将新文件移动到旧文件
您通常无法使用大多数文件系统向后扩展文件。
通常,保存文件时,现有数据将被完全覆盖。 即使您只更改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