如何在R中压缩多个CSV文件?

6

我正在尝试在R中压缩多个CSV文件。以下是参考代码。

# Create two dataframes using inbuilt datasets for reproducible code
df1 <- head(mtcars)
df2 <- head(iris)

# Write the files as CSV into working directory
write.csv(df1, file = "Test_File1.csv", row.names = FALSE, quote = FALSE)
write.csv(df2, file = "Test_File2.csv", row.names = FALSE, quote = FALSE)

# Read the 2 CSV file names from working directory
Zip_Files <- list.files(path = getwd(), pattern = ".csv$")

# Zip the files and place the zipped file in working directory
zip(zipfile = "TestZip", files = Zip_Files)

我收到了以下警告信息。未创建Zip文件。
Warning message:
running command '"zip" -r9X "TestZip" "Test_File1.csv" "Test_File2.csv" ' had status 127

我甚至尝试了这个命令来读取CSV文件名:Zip_Files <- list.files(path = getwd(), pattern = ".csv$", full.names = TRUE)但我仍然收到上面显示的警告信息。我已经在我的电脑上安装了WinRAR7-Zip。我正在使用最新版本的R(3.4.2 64位)以及最新版本的RStudio。我有一个Windows 7 x64操作系统。希望能得到任何关于此问题的帮助。

1
如果您查看帮助文件?zip,它会说:“在Windows上,默认情况下依赖于路径中存在一个zip程序(例如来自Rtools的程序)。” 您似乎没有名为“zip”的程序在您的路径中。尝试打开命令提示符并键入“zip -h”。您是否收到“未被识别为内部或外部命令”? - G5W
没错,@G5W。我刚刚打开了命令提示符并输入了建议的 zip-h。但是我得到了 'zip' 不是内部或外部命令,也不是可运行的程序或批处理文件。 的错误信息。 - Code_Sipra
你的计算机上有用于压缩和解压文件的程序吗? - G5W
是的,我有。如我帖子中所提到的,我已在计算机上安装了WinRAR7-Zip - Code_Sipra
3个回答

12

问题在于R的zip实际上没有压缩文件的代码。它调用外部程序来执行此操作。您必须让zip知道要使用哪个程序以及将哪些参数传递给该程序。您应该能够通过以下方式使其正常工作:

问题是 R 的 zip 并没有真正的编写代码来压缩文件,而是调用外部程序来完成。你需要指定zip要使用哪个程序以及传递给该程序哪些参数才行。你可以按照以下步骤来实现:

zip(zipfile = "TestZip", files = Zip_Files, flags = " a -tzip",
    zip = "C:\\Program Files\\7-Zip\\7Z")

如果你的7Zip命令行版本(7Z)的路径与本文中不同,请进行相应调整以匹配你的安装。

一些解释:

zip = "C:\\Program Files\\7-Zip\\7Z"参数告诉R使用哪个程序来压缩。在这种情况下,我指向了7Zip的命令行版本7Z,但你可以通过更改此参数来指向其他命令行程序。

flags = " a -tzip"参数取决于你正在使用的程序。我为7Z设置了这个参数。阅读7Z文档,你会发现需要给7Z一个命令(“a”)和标志(“-tzip”)。 “a”命令的意思是将这些文件添加到归档文件中。“-tzip”标志的意思是将其制作成zip归档而不是7Z归档。对于不同的程序,你需要阅读文档并为该程序构建适当的标志。

更新:如果你需要在各种客户机上具有这种功能,则应考虑查看zip包。它不需要任何外部程序,并提供类似的功能。


非常感谢您抽出时间来查看这个问题,@GSW。我有几个问题。flags = "a -tzip"是什么意思?如果用户在他们的系统中安装了Winzip或WinRAR或任何其他程序,该怎么办?我该如何相应地更改代码? - Code_Sipra
我会在答案中添加回复。 - G5W
此外,有没有办法让 R 自动检查可用的压缩软件以压缩文件,而不是我指定? 我使用的 rscript 将被多个客户使用。我不知道他们在系统中安装了哪个软件。因此有这个问题。 - Code_Sipra
此外,补充回答。 - G5W
再次感谢。我会尝试探索您的解决方案,并尝试使用其他选项替换7Z,看看是否有效。一旦我有了结果,我会在这个帖子中更新。谢谢! - Code_Sipra
显示剩余2条评论

6
你可以安装zip插件并在你的代码中使用它。这样,任何使用你的代码的人都可以压缩文件,而无需安装或搜索配置,并且该方法适用于任何操作系统。
library(zip)

# Create two dataframes using inbuilt datasets for reproducible code
df1 <- head(mtcars)
df2 <- head(iris)

# Write the files as CSV into working directory
write.csv(df1, file = "Test_File1.csv", row.names = FALSE, quote = FALSE)
write.csv(df2, file = "Test_File2.csv", row.names = FALSE, quote = FALSE)

# Read the 2 CSV file names from working directory
Zip_Files <- list.files(path = getwd(), pattern = ".csv$")

# Zip the files and place the zipped file in working directory
zip::zip(zipfile = "TestZip", files = Zip_Files)

谢谢,这个方法可行 @BenoitLondon!实际上我正试图避免安装额外的软件包来执行我的程序,出于各种原因。对于像 R 这样强大的工具,它支持使用 unzip() 进行文件解压缩,但却没有内置的文件压缩支持,有点令人惊讶! - Code_Sipra

3

zip库中的zip函数已经被弃用。如果您想要使用绝对路径压缩多个文件,您需要使用zipr。以下是我使用的方法。

# Install the zip package and call it
install.packages("zip")
library(zip)

# Create two dataframes using prebuilt datasets for reproducible code
df1 <- head(mtcars)
df2 <- head(iris)

# Write the files as CSV into working directory
write.csv(df1, file = "\\path\\to\\your_working_directory\\Test_File1.csv", row.names = FALSE, quote = FALSE)
write.csv(df2, file = "\\path\\to\\your_working_directory\\Test_File2.csv", row.names = FALSE, quote = FALSE)

# Read the 2 CSV file names from working directory
Zip_Files <- list.files(path = "\\path\\to\\your_working_directory\\", pattern = ".csv$", full.names=TRUE)

# Zip the files and place the zipped file in working directory
zip::zipr(zipfile = "\\path\\to\\your_working_directory\\Test.Zip", files = Zip_Files)

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