使用R从LZMA存档中提取文件

3
我正在尝试使用R从API下载的LZMA存档中提取文件,其中包含JSON文件,并对其进行翻译。在我的计算机上,我可以在Windows Explorer中手动提取文件而没有任何问题。
以下是我目前的代码(已删除API详细信息):
tempFile <- tempfile()
destDir <- "extracted-files"
if (!dir.exists(destDir)) dir.create(destDir)

download.file("api_url.tar.xz", destfile = tempFile)
untar(tempFile, exdir = destDir)

当我尝试解压文件时,出现以下错误信息:
/usr/bin/tar: This does not look like a tar archive
/usr/bin/tar: Skipping to next header
/usr/bin/tar: Exiting with failure status due to previous errors
Warning messages:
1: running command 'tar.exe -xf "C:\Users\XXX\AppData\Local\Temp\RtmpMncPWp\file2eec75e23a15" -C "extracted-files"' had status 2 
2: In untar(tempFile, exdir = destDir) :
  ‘tar.exe -xf "C:\Users\XXX\AppData\Local\Temp\RtmpMncPWp\file2eec75e23a15" -C "extracted-files"’ returned error code 2

我正在使用安装了 R 版本 3.3.1 (2016-06-21) 的 Windows 10 操作系统。


使用library(archive)添加了一个解决方案,它对我来说速度最快,而且支持在无需先解压缩文件的情况下从存档中读取文件。 - Tom Wenseleers
3个回答

1

使用 library(archive),您可以在不必先解压缩的情况下读取存档文件中特定的 CSV 文件:

library(archive)
library(readr)
read_csv(archive_read("api_url.tar.xz", file = 1), col_types = cols()) # adjust file=XX as appropriate

这样会快很多。

要解压缩所有文件,可以使用以下命令:

archive_extract("api_url.tar.xz", dir=XXX)

这对我来说效果非常好,比未编译的untar()函数更快,并且在所有平台上都可用。它支持'tar'、'ZIP'、'7-zip'、'RAR'、'CAB'、'gzip'、'bzip2'、'compress'、'lzma'和'xz'格式。


0

已解决:

虽然在 Mac 上看起来完美无缺,但要在 Windows 上运行,您需要以二进制模式打开压缩的 .xz 文件连接,然后再将其传递给 untar() 函数:

download.file(url, tmp)
zz <- xzfile(tmp, open = "rb")
untar(zz, exdir = destDir)

0
一个替代方案,甚至更简单的解决方法是在download.file()函数中指定'mode'参数,如下所示:
download.fileurl, destfile = tmp, mode = "wb")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接