fread 不读取字符向量
fread does not read character vector
我正在尝试通过以下代码使用 R 下载列表:
name <- paste0("https://www.sec.gov/Archives/edgar/full-index/2016/QTR1/master.idx")
master <- readLines(url(name))
master <- master[grep("SC 13(D|G)", master)]
master <- gsub("#", "", master)
master_table <- fread(textConnection(master), sep = "|")
最后一行returns出错。我验证了 textConnection
按预期工作并且我可以使用 readLines
从它读取,但是 fread
returns 一个错误。 read.table
遇到同样的问题。
Error in fread(textConnection(master), sep = "|") : input= must be a single character string containing a file name, a system command containing at least one space, a URL starting 'http[s]://', 'ftp[s]://' or 'file://', or, the input data itself containing at least one \n or \r
我做错了什么?
1) 第一行不需要paste
。在下一行中,我们不需要 url(...)
。此外,我们将输入限制为 1000 行以在更短的时间内说明示例。如果我们在fread
中指定na.strings
,我们可以省略gsub
。还将输入折叠为单个字符串允许消除 fread
.
中的 textConnection
library(data.table)
name <- "https://www.sec.gov/Archives/edgar/full-index/2016/QTR1/master.idx"
master <- readLines(name, 1000)
master <- master[grep("SC 13(D|G)", master)]
master <- paste(master, collapse = "\n")
master_table <- fread(master, sep = "|", na.strings = "")
2) 第二种可能更快的方法是先下载文件,然后 fread
如图所示。
name <- "https://www.sec.gov/Archives/edgar/full-index/2016/QTR1/master.idx"
download.file(name, "master.txt")
master_table <- fread('findstr "SC 13[DG]" master.txt', sep = "|", na.strings = "")
以上为Windows。对于 Linux 和 bash 将最后一行替换为:
master_table <- fread("grep 'SC 13[DG]' master.txt", sep = "|", na.strings = "")
我不太确定更广泛的上下文,特别是您是否需要使用 fread()
,但是
s <- scan(text=master, sep="|", what=character())
效果很好,而且速度很快(0.1 秒)。
我想添加在 fread
https://github.com/Rdatatable/data.table/issues/1423 中实现的最终解决方案。
也许这也可以为其他人节省一些时间。
所以解决方案变得更简单:
library(data.table)
name <- "https://www.sec.gov/Archives/edgar/full-index/2016/QTR1/master.idx"
master <- readLines(name, 1000)
master <- master[grep("SC 13(D|G)", master)]
master <- paste(master, collapse = "\n")
master_table <- fread(text = master, sep = "|")
我正在尝试通过以下代码使用 R 下载列表:
name <- paste0("https://www.sec.gov/Archives/edgar/full-index/2016/QTR1/master.idx")
master <- readLines(url(name))
master <- master[grep("SC 13(D|G)", master)]
master <- gsub("#", "", master)
master_table <- fread(textConnection(master), sep = "|")
最后一行returns出错。我验证了 textConnection
按预期工作并且我可以使用 readLines
从它读取,但是 fread
returns 一个错误。 read.table
遇到同样的问题。
Error in fread(textConnection(master), sep = "|") : input= must be a single character string containing a file name, a system command containing at least one space, a URL starting 'http[s]://', 'ftp[s]://' or 'file://', or, the input data itself containing at least one \n or \r
我做错了什么?
1) 第一行不需要paste
。在下一行中,我们不需要 url(...)
。此外,我们将输入限制为 1000 行以在更短的时间内说明示例。如果我们在fread
中指定na.strings
,我们可以省略gsub
。还将输入折叠为单个字符串允许消除 fread
.
textConnection
library(data.table)
name <- "https://www.sec.gov/Archives/edgar/full-index/2016/QTR1/master.idx"
master <- readLines(name, 1000)
master <- master[grep("SC 13(D|G)", master)]
master <- paste(master, collapse = "\n")
master_table <- fread(master, sep = "|", na.strings = "")
2) 第二种可能更快的方法是先下载文件,然后 fread
如图所示。
name <- "https://www.sec.gov/Archives/edgar/full-index/2016/QTR1/master.idx"
download.file(name, "master.txt")
master_table <- fread('findstr "SC 13[DG]" master.txt', sep = "|", na.strings = "")
以上为Windows。对于 Linux 和 bash 将最后一行替换为:
master_table <- fread("grep 'SC 13[DG]' master.txt", sep = "|", na.strings = "")
我不太确定更广泛的上下文,特别是您是否需要使用 fread()
,但是
s <- scan(text=master, sep="|", what=character())
效果很好,而且速度很快(0.1 秒)。
我想添加在 fread
https://github.com/Rdatatable/data.table/issues/1423 中实现的最终解决方案。
也许这也可以为其他人节省一些时间。
所以解决方案变得更简单:
library(data.table)
name <- "https://www.sec.gov/Archives/edgar/full-index/2016/QTR1/master.idx"
master <- readLines(name, 1000)
master <- master[grep("SC 13(D|G)", master)]
master <- paste(master, collapse = "\n")
master_table <- fread(text = master, sep = "|")