使用readr中的write_csv()函数可以将stdout写入文件吗?

13

我正在使用bash通过Rscript进行数据管道传输,方法如下:

cat random.csv | Rscript test.R arg >| delete.csv

我的目的是使用R包中的readr读取标准输入并写入标准输出。我在这里找到了有关标准输入的答案

test.R

#!/usr/bin/Rscript
suppressMessages(library(readr))

args  <- commandArgs(trailingOnly = TRUE)

df.in <- read_csv(file("stdin"))

write_csv(df.in, path = stdout())

上述代码在命令行产生以下错误信息:

错误信息

Error in path.expand(path) : invalid 'path' argument
Calls: write_csv -> write_delim -> normalizePath -> path.expand
Execution halted

我还尝试了write_csv(df.in, file("stdout"))write_csv(df.in, stdout()),结果产生了相同的错误信息。

为了可重复性,这里提供一个random.csv的链接。

WHO全球结核病报告变量定义[43kb]


https://github.com/tidyverse/readr/issues/703 - qwr
4个回答

26

readr 中有一个名为 format_csv 的函数可以实现这个功能。使用它来代替 write_csv


cat(format_csv(df.in))

2
谢谢 @m0nhawk - 这非常接近。错误信息不再出现了。但是,delete.csv 中的所有数据都打印在一行上,而应该有多行。如果您用 cat() 包装您的答案,结果就完美了。例如 cat(format_csv(df.in))。更新后我会接受您的答案。 - Luke Singham

2

读取标准输入的方法:

df.in <- read_csv(paste(collapse = "\n", readLines(file("stdin"))))

用于向标准输出写入:

writeLines(format_csv(tibble(a=c(1,2))), stdout())

#or
writeLines(format_csv(df.in), stdout())

致敬:jimhester

0

使用基础R中的write.tablewrite.csv,您可以将文件名指定为""以打印到STDOUT:

file: either a character string naming a file or a connection open
      for writing.  ‘""’ indicates output to the console.

例子:

$ Rscript -e 'write.csv(head(mtcars),"",quote=F)'
,mpg,cyl,disp,hp,drat,wt,qsec,vs,am,gear,carb
Mazda RX4,21,6,160,110,3.9,2.62,16.46,0,1,4,4
Mazda RX4 Wag,21,6,160,110,3.9,2.875,17.02,0,1,4,4
Datsun 710,22.8,4,108,93,3.85,2.32,18.61,1,1,4,1
Hornet 4 Drive,21.4,6,258,110,3.08,3.215,19.44,1,0,3,1
Hornet Sportabout,18.7,8,360,175,3.15,3.44,17.02,0,0,3,2
Valiant,18.1,6,225,105,2.76,3.46,20.22,1,0,3,1

-2

这个回答并没有解决正确的问题 - OP 知道如何将格式设置为 CSV,但不知道如何写入到 stdout - Ken Williams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接