在 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 内容的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中流式传输 CSV 文件

read_csv() 中的 S3 阅读器是先将文件下载到磁盘还是使用流式传输?

Spark 流式传输 sourceArchiveDir 不会将文件移动到存档目录

Groovy Grails,如何在控制器的响应中流式传输或缓冲大文件?

流式传输作业失败-状态架构不兼容问题

NodeJS - 等到流式传输多个文件完成后再继续编写代码