【问题标题】:How to remove trailing blanks or linebreaks from CSV file created with write.table?如何从使用 write.table 创建的 CSV 文件中删除尾随空格或换行符?
【发布时间】:2017-04-10 07:36:09
【问题描述】:

我想将 R 中的数据框写入 CSV 文件。考虑以下玩具示例

df <- data.frame(ID = c(1,2,3), X = c("a", "b", "c"), Y = c(1,2,NA))
df[which(is.na(df[,"Y"])), 1]

write.table(t(df), file = "path to CSV/test.csv", sep = ""), col.names=F, sep=",", quote=F)

test.csv中的输出如下所示

ID,1,2,3
X,a,b,c
Y, 1, 2,NA

乍一看,这正是我需要的,但是在上面的代码插入中看不到的是,在最后一行的NA之后,还有另一个换行符。但是,当我将 test.csv 传递给网站上的 Javascript 图表时,尾随换行符会引起麻烦。

有没有办法避免在 R 中出现这种最后的换行符?

【问题讨论】:

  • 我认为你的 write.table 语句中有一个额外的 ) ,还有一个额外的 sep=;并不重要。我只是在尝试验证 stringr 解决方案时注意到

标签: r csv


【解决方案1】:

这有点令人费解,但可以获得您想要的结果:

zz <- textConnection("foo", "w")
write.table(t(df), file = zz, col.names=F, sep=",", quote=F)
close(zz)
foo
# [1] "ID,1,2,3"   "X,a,b,c"    "Y, 1, 2,NA"
cat(paste(foo, collapse='\n'), file = 'test.csv', sep='')

您最终应该得到一个仅在前两个数据行之后有换行符的文件。

【讨论】:

  • 是的@Thomas,这行得通!感谢您的即时帮助。
【解决方案2】:

您可以使用 sed 等命令行实用程序从文件中删除尾随空格:

sed -e :a -e 's/^.\{1,77\}$/ &amp; /;ta'

或者,您可以先写一行,然后使用append

【讨论】:

  • 谢谢@NerdLife,但stringr 的解决方案仍然会在最后产生换行符。
  • @pfifas 不客气。有吗?抱歉,我会在今天晚些时候验证后将其删除。我从另一个 StackOverflow 帖子中分出它,说它解决了这个问题:stackoverflow.com/questions/12185889/…
  • 是的,你是对的。对不起,虚假的解决方案;我现在将其删除。看起来它应该可以工作,我相信它只需要一个小的调整,但你有一个解决方案,所以我将删除它。最后一件事——仅供参考,很多时候尾随空格可能是由所使用的回车类型引起的。
【解决方案3】:

与@Thomas 的答案类似,但打字略少。将write.csv 的输出发送到字符串 (capture.out)。连接字符串 (paste) 并用换行符分隔元素 (collapse = \n)。使用cat 写入文件。

x <- capture.output(write.csv(df, row.names = FALSE, quote = FALSE))
cat(paste(x, collapse = "\n"), file = "df.csv") 

您也可以使用 readr 包中的 format_csv 创建一个带换行符的字符向量 (\n)。用substr 删除最后一个行尾\n。使用cat 写入文件。

library(readr)
x <- format_csv(df)
cat(substr(x, 1, nchar(x) - 1), file = "df.csv")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-15
    • 2012-09-24
    • 2017-04-30
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多