【问题标题】:read_fwf not working while unzipping files解压缩文件时 read_fwf 不起作用
【发布时间】:2016-07-31 15:44:01
【问题描述】:

我想将几个固定宽度格式的txt文件读入R,但我首先需要将它们解压缩。

由于它们是非常大的文件,我想使用 readr 包中的 read_fwf,因为它非常快。

当我这样做时:

read_fwf(unz(zipfileName, fileName), fwf_widths(colWidths, col_names = colNames))

我收到此错误Error in isOpen(con) : invalid connection

但是当我这样做时:

read.table(unz(zipfileName, fileName)) 没有指定宽度,它读入R 就好了。关于为什么这不适用于 read_fwf 的任何想法?

我无法制作可重现的示例。这是我得到的:

df <- data.frame(
  rnorm(100),
  rnorm(100)
)

write.table(df, "data.txt", row.names=F, col.names = F)
zip(zipfile = "data.zip", files = "data.txt")
colWidths <- rep(2, 100)
colNames <- c("thing1","thing2")
zipfileName <- "data.zip"
fileName <- "data.csv"

【问题讨论】:

  • 我只看到一列。我也没有看到你定义了 'zipfileName'
  • @42- 进行了编辑以使示例与问题匹配。
  • 仔细阅读?unz。特别是:"The 'description' is the full path to the zip file, with ‘.zip’ extension if required."
  • 在我的实际代码中,我将 zip 文件的完整路径指定为 description,并将 zip 中的 .txt 文件指定为 filename。问题是当基本 R 函数包裹在 unz 函数周围时解压缩工作正常,但使用 read_fwf 时出现错误。
  • 没错。所以正如医生(我)所说:“如果你这样扭我的手臂时总是很痛,......那就停止这样做”。 (至少在您向 Hadley 发送错误报告之前。)

标签: r readr


【解决方案1】:

在将unz-ed 文件传递​​给它时,我也无法让 read_fwf 读取 zip 文件,但随后读取 ?read_fwf 页面我看到压缩文件承诺会自动处理。作为示例,您没有创建一个有效的 fwf 文件,因为两列都没有固定位置,但输出很明显:

read_fwf(file="~/data.zip", fwf_widths(widths=rep(16,2) ,col_names = colNames) )
Warning: 1 parsing failure.
row    col expected actual
  3 thing2 16 chars     14
# A tibble: 100 x 2
             thing1               thing2
              <chr>                <chr>
1  1.37170820802141    -0.58354018425322
2  0.03608988699566 7 -0.402708262870141
3  1.02963272114 -1       .0644333112294
4  0.73546166509663  8 0.607941664550652
5  -1.5285547658079   -0.319983522035755
6  -1.4673290956901    0.523579231857175
7  0.24946312418273 9 -0.574046655188405
8  0.58126541455159 5 -0.406516495600345
9   1.5074477698981   -0.496512994239183
10 -2.2999905645658 8 -0.662667854341041
# ... with 90 more rows

您收到的错误来自 unz 函数,因为它需要一个 zip 扩展文件的完整路径(并且显然不接受隐式工作目录位置)作为“描述”参数。它的第二个参数是 zip 文件中压缩文件的名称。我认为它返回一个连接,但不是 read_fwf 能够处理的类型。手动解析我发现我们俩的错误来自read_connection中的这段代码:

> readr:::read_connection
function (con) 
{
    stopifnot(is.connection(con))
    if (!isOpen(con)) {
        open(con, "rb")
        on.exit(close(con), add = TRUE)
    }
    read_connection_(con)
}
<environment: namespace:readr>

您没有为unz 提供有效的“描述”参数,即使我们努力使用open(con, "rb") 打开也失败了,因为各种文件处理函数中的参数缺乏标准化。

【讨论】:

  • 幸运的是,在我的情况下,每个 zip 文件只包含我想读入 R 的一个文件。我很好奇 read_fwf 如何处理包含多个文件的 zip 文件。
  • 当我给它一个包含两个项目的 zip 文件时,它选择了第一个。 (如果我想要第二个或以后的文件,我会将 zip 文件扩展为一个完整的目录,然后使用它。)
  • 感谢您的检查。很高兴知道这一点,我认为这对 read_fwf 应该如何处理 zip 文件有一些影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 2016-04-03
相关资源
最近更新 更多