如何在文件前添加(在顶部添加)

时间:2011-03-31 13:21:15

标签: java c++ file r prepend

想象一下你有一个文件

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

8 个答案:

答案 0 :(得分: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)

答案 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 ++中,如果您愿意亲自动手,可以采取以下步骤。

  1. 将新内容流式传输到临时缓冲区(以便您知道新内容的确切大小)
  2. 调整文件大小(truncate()ftruncate())以包含当前大小加上新大小
  3. 将整个文件映射到
  4. memmove()原始文件大小为新位置,即新内容大小
  5. 在位置0复制新数据。
  6. 这可能不那么努力了:

    1. 构建新文件并在
    2. 中推送新内容
    3. 阅读旧文件并将其推入
    4. 调用操作系统调用以将新文件移动到旧文件

答案 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