在 R 中流式传输 CSV 内容
Posted
技术标签:
【中文标题】在 R 中流式传输 CSV 内容【英文标题】:Stream in CSV content in R 【发布时间】:2021-12-31 11:39:33 【问题描述】:我了解如何读取存储在磁盘上的 CSV 文件,但我不知道如何使用 R 通过 CLI 流式传输 CSV 内容。
例如,使用简单的 CLI 从磁盘读取 CSV 文件。
library(optparse)
option_list <- list(
# Absolute filepath to CSV file.
make_option(c("-c","--csv"),type="character",default=NULL,
help="CSV filepath",metavar="character")
);
opt_parser <- OptionParser(option_list=option_list)
opt <- parse_args(opt_parser)
csv_filepath <- opt$csv
csv <- read.csv(csv_filepath)
如果我正在使用数据流,我该怎么做?
【问题讨论】:
如果“流”是指“从 url 读取”,this 可能会有所帮助。 看不懂你的例子,因为你初始化了一个变量option_list,没有用到。然后使用未定义的变量 opt。另外,在这种情况下什么是流?您想从内存中的内容中读取吗? @user2332849 你是对的 - 我已经更新了这个例子。该流是 CSV 字节块的流。所以是的,读取已经在内存中的内容。以一种奇怪的方式,我正在通过另一种语言连接 R 脚本,并希望将 CSV 流“热土豆”到 R 而不保存到磁盘。 【参考方案1】:R 总是从连接中读取。连接可以是文件、url、内存中的文本等等。
因此,如果您想从内存中的内容中读取 csv 格式的数据,您只需使用 text= 参数,而不是文件名。
像这样:
my_stream = "name;age\nJulie;25\nJohn;26"
read.csv(text = my_stream, sep = ";", header = T)
输出将是:
name age
1 Julie 25
2 John 26
当然,您可以正常向read.csv()
添加附加参数。
【讨论】:
【参考方案2】:R 源码和包optparse
.
首先,写一个R源文件"example.R"
,如下所示。
#!/usr/bin/env Rscript
#
# R source: example.R
# options: -c --csv
#
library(optparse)
option_list <- list(
# Absolute filepath to CSV file.
make_option(c("-c","--csv"),type="character",default=NULL,
help="CSV filepath",metavar="character")
)
opt_parser <- OptionParser(option_list=option_list)
opt <- parse_args(opt_parser)
csv_filepath <- opt$csv
csv <- read.csv(csv_filepath)
message(paste("\nfile read:", csv_filepath, "\n"))
str(csv)
然后,更改执行权限,以便 bash shell 识别 #!
shebang 并运行 Rscript
传递文件。
在这种情况下,我将只更改用户权限,而不更改其组。
bash$ chmod u+x example.R
测试。
我已经用这个 data.frame 测试了上面的脚本:
df1 <- data.frame(id=1:5, name=letters[1:5])
write.csv(df1, "test.csv", row.names=FALSE)
并且,在 Ubuntu 20.04 LTS 上,运行命令 ./example.R
,将 CSV 文件名传递给参数 csv
。该命令及其输出是
bash$ ./example.R --csv=test.csv
file read: test.csv
'data.frame': 5 obs. of 2 variables:
$ id : int 1 2 3 4 5
$ name: chr "a" "b" "c" "d" ...
【讨论】:
以上是关于在 R 中流式传输 CSV 内容的主要内容,如果未能解决你的问题,请参考以下文章
read_csv() 中的 S3 阅读器是先将文件下载到磁盘还是使用流式传输?
Spark 流式传输 sourceArchiveDir 不会将文件移动到存档目录