【问题标题】:Data table fread with zip file in other directory with spaces in the name名称中带有空格的其他目录中带有 zip 文件的数据表 fread
【发布时间】:2018-06-15 08:51:26
【问题描述】:

我正在尝试使用命令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

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

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

【问题讨论】:

  • 在这种情况下与fread 的争论是系统命令。所以文件路径应该有`\`而不是/。试试看:fread("unzip -cq C:\\Users\\Myuser\\file.zip")
  • 谢谢,但这对我也不起作用。
  • 你的路径中有空格吗?
  • 我在为 fread 发出命令之前使用 shQuote 来包装路径......到目前为止它在 Windows fwiw 上工作。
  • @Frank 请将其作为答案,以便我关闭它,谢谢它有效!

标签: r data.table fread


【解决方案1】:

我为此使用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)

【讨论】:

  • 第一部分我拿到了,第二部分我要试试!无论如何谢谢你!
  • 是的,只是想我会发布它以防最终对其他人有用:)
【解决方案2】:

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

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

【讨论】:

  • 感谢您的回答。这适用于路径中没有空格的情况(在您的示例中为 myVar),但在有空格的情况下仍然失败。
猜你喜欢
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 2014-08-20
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
相关资源
最近更新 更多