如何从使用write.table创建的CSV文件中删除尾随空格或换行符?

4
我可以帮您将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解决方案时注意到的。 - Hack-R
3个回答

3
这可能有点复杂,但可以获得您想要的结果:
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,这个可以!感谢你的即时帮助。 - pfifas

3

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

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

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


谢谢 @NerdLife,但是使用 stringr 的解决方案仍会在末尾产生一个换行符。 - pfifas
@pfifas 不用谢。它有问题吗?抱歉,我会在今天稍后验证后将其删除。我从另一个StackOverflow帖子中fork了它,该帖子说它可以解决这个问题:http://stackoverflow.com/questions/12185889/how-to-remove-trailing-spaces-in-write-table-in-r - Hack-R
是的,你说得对。抱歉提供了错误的解决方案;我现在会将其删除。看起来它应该可以工作,我相信只需要进行一些微小的调整,但既然你已经有了一个解决方案,我就将其删除。最后提醒一下——FYI,很多时候尾随空格可能是由于使用的回车类型引起的。 - Hack-R

0
一个与@Thomas的答案类似但打字稍微少一些的替代方案。将write.csv的输出发送到字符字符串(capture.out)中。使用换行符(collapse = \n)连接字符串(paste)并分隔元素。使用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")

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