在 R 中流式传输 CSV 内容

Stream in CSV content in R

提问人:irahorecka 提问时间:11/21/2021 最后编辑:irahorecka 更新时间:11/22/2021 访问量:206

问:

我了解如何读取存储在磁盘上的 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)

如果我正在处理数据流,我该怎么做?

r csv io cran

评论

0赞 Andre Wildberg 11/22/2021
如果“流”是指“从 url 读取”,这可能会有所帮助。
0赞 user2332849 11/22/2021
我不明白你的例子,因为你初始化了一个变量option_list,它没有使用。然后使用变量 opt,该变量未定义。另外,在这种情况下,什么是流?您想从内存中已有的内容中读取内容吗?
0赞 irahorecka 11/22/2021
@user2332849你是对的 - 我已经更新了示例。该流是 CSV 字节块的流。所以,是的,阅读内存中已有的内容。以一种奇怪的方式,我通过另一种语言连接 R 脚本,并希望将 CSV 流“热”到 R,而无需保存到磁盘。

答:

1赞 user2332849 11/22/2021 #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()

1赞 Rui Barradas 11/22/2021 #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 中,运行命令将 CSV 文件名传递给它 参数 。该命令及其输出是./example.Rcsv

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" ...