数据表fread在其他目录中包含zip文件,名称中包含空格

数据表fread在其他目录中包含zip文件,名称中包含空格,r,data.table,fread,R,Data.table,Fread,我试图通过使用命令fread(“unzip-cq file.zip”)读取zip文件中的csv,该命令在文件位于我的工作目录中时非常有效。 但是,当我在不更改目录的情况下通过指定文件路径来尝试该命令时,比如说fread(“unzip-cq C:/Users/My user/file.zip”)我得到一个错误,说下面的unzip:找不到C:/Users/My或C:/Users/My.zip 发生这种情况的原因是我的路径中有一些空间,但解决方法是什么 我认为唯一的选择是只更改到每个文件所在的目录并从

我试图通过使用命令
fread(“unzip-cq file.zip”)
读取zip文件中的csv,该命令在文件位于我的工作目录中时非常有效。 但是,当我在不更改目录的情况下通过指定文件路径来尝试该命令时,比如说
fread(“unzip-cq C:/Users/My user/file.zip”)
我得到一个错误,说下面的
unzip:找不到C:/Users/My或C:/Users/My.zip

发生这种情况的原因是我的路径中有一些空间,但解决方法是什么


我认为唯一的选择是只更改到每个文件所在的目录并从那里读取,但这并不理想。

尝试将位置分配给变量,然后使用“粘贴”调用zip文件,如下所示:

myVar<-"C:/Users/Myuser/"
fread(paste0("unzip -cq ",myVar,"file.zip"))

myVar我使用
shQuote
这样做,比如

fread_zip = function(fp, silent=FALSE){
  qfp = shQuote(fp)

  patt = "unzip -cq %s"

  thecall = sprintf(patt, qfp)
  if (!silent) cat("The call:", thecall, sep="\n")

  fread(thecall)
}
定义一个模式,然后用
sprintf
替换,可以保持可读性并更易于管理。例如,我对
.tar.gz
文件有一个类似的包装器(显然需要在步骤之间用
|
管道解压缩两次)


如果您的zip包含多个CSV,
fread
不会设置为全部读取(尽管有)。我对该案例的解决方案目前看起来像

library(magrittr)
fread_zips = function(fp, unzip_dir = file.path(dirname(fp), sprintf("csvtemp_%s", sub(".zip", "", basename(fp)))), silent = FALSE, do_cleanup = TRUE){
  # only tested on windows
  # fp should be the path to mycsvs.zip
  # unzip_dir should be used only for CSVs from inside the zip

  dir.create(unzip_dir, showWarnings = FALSE)

  # unzip

  unzip(fp, overwrite = TRUE, exdir = unzip_dir)

  # list files, read separately
  # not looking recursively, since csvs should be only one level deep

  fns = list.files(unzip_dir)

  if (!all(tools::file_ext(fns) == "csv")) stop("fp should contain only CSVs")

  res = lapply(fns %>% setNames(file.path(unzip_dir, .), .), fread)

  if (do_cleanup) unlink(unzip_dir, recursive = TRUE)

  res
}
因此,因为我们没有直接向fread传递命令行调用,所以这里不需要
shQuote
。我昨天编写并使用了这个函数,所以可能还有一些疏忽或bug


magrittr
%%>%%
管道零件可以写成
集合名(file.path(unzip_dir,fns,fns)

在这种情况下,指向
fread
的参数是一个系统命令。因此,文件路径应该有``而不是
/
。请尝试:
fread(“unzip-cq C:\\Users\\Myuser\\file.zip”)
谢谢,但这对我也不起作用。您的路径中有空格吗?在为fread发出命令之前,我使用shQuote包装路径。。。到目前为止,它在Windows fwiw上运行。@Frank请将其作为答案,以便我可以关闭它,谢谢,它运行正常!谢谢你的回答。这在路径中没有空格的情况下有效(在你的例子中是myVar),但在有空格的情况下仍然失败!无论如何谢谢你!是的,我只是想把它贴出来,以防最终对其他人有用:)