2016-11-21 9 views
1

Rで、gzconをメモリに保存するにはどうすればよいですかメモリ内のuntar gzcon R

背景:

私はメモリ内の.tar.gzファイルにいくつかの操作を実行する必要があり、ファイルがディスクに書き込まれることはありませんということが重要です。ファイルは最初にcurl_fetch_memoryでダウンロードされ、以下の例のデータに似たオブジェクトが生成されます。

オブジェクトにuntar(gzcon(rawConnection(res$content)))を実行すると、データがディスクに書き込まれるため、望ましくありません。

例データ(コンテンツhello world!test.txtという名前のファイルを含む.tar.gz):

res <- structure(list(url = "sftp://[email protected]:/test.tar.gz", 
status_code = 0L, headers = raw(0), modified = structure(1479765215L, class = c("POSIXct", 
"POSIXt")), times = structure(c(0, 0, 0, 0, 0.312, 0.312), .Names = c("redirect", 
"namelookup", "connect", "pretransfer", "starttransfer", 
"total")), content = as.raw(c(0x1f, 0x8b, 0x08, 0x00, 0xdf, 
0x6c, 0x33, 0x58, 0x00, 0x03, 0xed, 0xce, 0x3d, 0x0a, 0xc2, 
0x50, 0x10, 0xc4, 0xf1, 0xad, 0x73, 0x8a, 0xe7, 0x05, 0x64, 
0x37, 0x79, 0xd9, 0x9c, 0x47, 0x30, 0x90, 0xe2, 0x49, 0x20, 
0x59, 0x3f, 0x8e, 0xaf, 0x22, 0x42, 0x2a, 0x4d, 0x13, 0x44, 
0xf8, 0xff, 0x9a, 0x29, 0x66, 0x8a, 0x89, 0x7e, 0x8e, 0x7d, 
0xdc, 0x42, 0x36, 0xa4, 0x0f, 0xee, 0xf9, 0x99, 0xd6, 0xb5, 
0xba, 0xcc, 0x17, 0x73, 0xb1, 0x46, 0x2d, 0xbb, 0x7b, 0xa3, 
0xad, 0xa8, 0x69, 0xae, 0x3b, 0x49, 0xba, 0xe5, 0xa9, 0xb7, 
0xf3, 0x1c, 0x87, 0x29, 0x25, 0xb9, 0x9c, 0x3e, 0xef, 0xbe, 
0xf5, 0x7f, 0x6a, 0xe8, 0x4b, 0x19, 0xd3, 0x75, 0x9c, 0xca, 
0x71, 0x57, 0x55, 0xbf, 0x7e, 0x03, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 
0xeb, 0x0e, 0x02, 0xc4, 0x36, 0xca, 0x00, 0x28, 0x00, 0x00 
))), .Names = c("url", "status_code", "headers", "modified", 
"times", "content")) 
+0

あなたは(私はしません)bashのコンソールからこれを実行する方法を知っているなら、あなたは 'からコードを読み取ることができるはずですuntar'と置き換えてハッキングする方法を見つけ出す。 –

答えて

1

それは、タールパイを解析することはそれほど難しくありません。 utils:::untar2というコアループは、メモリ内のuntarツールの実装には適しています。基本的に、tarファイルは、以下の構造を有する:

+-----------------+-----------+-----------------+-----------+-~ 
| 512-byte header | file data | 512-byte header | file data | 
+-----------------+-----------+-----------------+-----------+-~ 

タールヘッダフォーマットはGNU manual for tarでより詳細に記載されており、いくつかのファイル属性、マジックナンバー、およびチェックサムで構成されています。

、メモリ内untarしツールのための擬似コードは単純です:

repeat { 
    parse tar header with file attributes 
    for each block in file { 
    write block to raw connection 
    } 
    write raw connection and file attributes to file object 
    add file to list 
} 
return list of files 
1

はuntarし上extras = "O"旗はあなたに近いあなたが必要なものを取得していますか?私は、ファイル

echo "hello world" > afile 
tar -cvf afile.tar.gz afile 

した場合、私はGNUタール1.29を使用してい

untar('afile.tar.gz', compressed = 'gzip', extras = "-O") 

と(Rへの印刷)stdoutにそれを読むことができるよ例えば

+0

残念ながらそれはしません。そのフラグは内部のtarバージョンで何もしないように見え、stdoutには表示されません。 – ruser9575ba6f

+0

私はここに遅れていますが、それでも必要ならば上記の変更をチェックしてください –

関連する問題