解压缩文件时read_fwf无法正常工作

时间:2016-07-31 15:44:02

标签: r readr

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

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

当我这样做时:

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"

1 个答案:

答案 0 :(得分:2)

在将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扩展文件的完整路径(并且显然不会接受隐式工作目录位置)作为&#34;描述& #34;论点。它的第二个参数是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一个有效的&#34;描述&#34;参数,即使我们用open(con, "rb")打开的努力也失败了,因为各种文件处理函数中的参数缺乏标准化。