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

时间:2018-06-15 08:51:26

标签: r data.table fread

我正在尝试使用命令fread("unzip -cq file.zip")读取zip文件中的csv,该文件在我的工作目录中时可以正常工作。 但是当我通过指定文件的路径而不更改目录来尝试命令时fread("unzip -cq C:/Users/My user/file.zip")我收到错误,说明以下unzip: cannot find either C:/Users/My or C:/Users/My.zip

发生这种情况的原因是我的路径中有空格但是解决方法是什么?

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

2 个答案:

答案 0 :(得分:2)

我为此使用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来全部读取它们(尽管有an open issue)。目前,我针对该情况的解决方法如下...

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。我昨天编写并使用了此功能,因此可能仍然存在一些疏忽或错误。

可将magrittr %>%管道部件写为setNames(file.path(unzip_dir, fns), fns)

答案 1 :(得分:0)

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

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