read_fwf 解压缩文件时不工作
read_fwf not working while unzipping files
我想将几个固定宽度格式的 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"
我在将 unz
编辑的文件传递给它时也无法让 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 扩展文件的完整路径(并且显然不会接受隐式工作目录位置)作为 "description"争论。它的第二个参数是 zip 文件中压缩文件的名称。我认为它 returns 是一个连接,但不是 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
一个有效的 "description" 参数,即使我们努力用 open(con, "rb")
打开也会失败,因为在参数中缺乏标准化各种文件处理函数。
我想将几个固定宽度格式的 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"
我在将 unz
编辑的文件传递给它时也无法让 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 扩展文件的完整路径(并且显然不会接受隐式工作目录位置)作为 "description"争论。它的第二个参数是 zip 文件中压缩文件的名称。我认为它 returns 是一个连接,但不是 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
一个有效的 "description" 参数,即使我们努力用 open(con, "rb")
打开也会失败,因为在参数中缺乏标准化各种文件处理函数。