想象一下你有一个文件
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 ...)也欢迎(我很好奇其他语言是如何解决这个问题的。)
答案 0 :(得分:7)
不需要使用额外的文件。你可以这样做:
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)
答案 1 :(得分:6)
在linux shell中很容易:
echo 'your additional header here' >> tempfile
cat example.tst >> tempfile
mv tempfile example
rm tempfile
答案 2 :(得分:5)
在任何语言中,最终只有一种解决方案。那就是覆盖整个文件:
contents = readAllOf("example.txt")
overwrite("example.txt", header + contents )
答案 3 :(得分:2)
要么(A)读入文件,在之前添加标题并写回(如Gareth建议的那样)..或(B)缓存你想要写入文件的地方,并且只在你写完时全部写出来生成了你的标题。
答案 4 :(得分:2)
在C ++中,如果您愿意亲自动手,可以采取以下步骤。
truncate()
,ftruncate()
)以包含当前大小加上新大小memmove()
原始文件大小为新位置,即新内容大小这可能不那么努力了:
答案 5 :(得分:1)
您通常无法使用大多数文件系统向后扩展文件。
通常,保存文件时,现有数据会被完全覆盖。即使您只更改1,000,000行文件的前两行,应用程序通常会在您点击保存时将未更改的行重新写入磁盘。
对于大多数文件格式,任何标题都是固定大小的,因此更改它们不是问题。
还有基于流的格式;由于数据是从流中解析并用于构造文档,因此流可能包含在结果文档的开头插入一些数据的指令。但是,这些基于流的文件格式相当复杂。
答案 6 :(得分: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 { ...
)。
答案 7 :(得分: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