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)

それでも、R はファイルの読み取りと書き込みのパフォーマンスが高いことで有名ではないため、Linux シェルを使用することが最適なソリューションのようです。最初に完全なファイルを読み込む必要があるため、特にそうではありません。

例 :

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 シェルでは非常に簡単です。

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

どの言語でも、最終的には 1 つのソリューションしかありません。そして、それはファイル全体を上書きすることです:

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 行のファイルの最初の 2 行のみを変更した場合でも、通常、アプリケーションは、保存を押すと、変更されていない行をディスクに再書き込みします。

For most file formats, any headers are fixed size, so it's not a problem to change them.

There are also formats that are stream based; since the data is parsed from the stream and used to construct the document, it's possible for the stream to contain an instruction to insert some data at the beginning of the resulting document. These stream-based file formats are fairly complicated, though.

于 2011-03-31T13:26:52.727 に答える
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
于 2015-04-09T20:42:07.843 に答える
0

バッシュの使用:

$ 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

1つの sed コマンドでそれを行う方法がわかりません(sed -i -e '1i \\' -e '1 { ...最初の行の後に挿入します)。

于 2011-03-31T14:02:04.933 に答える