write.csv在R中的作用:在两者之间写入内容。

3

我有一个关于write.csv或write.table的问题 - 两者都没有达到我想要的效果,但产生了相同的结果:

我需要按照外部给定的格式生成一个.csv文件。要求如下:

字段始终为纯文本。只有当字段包含特殊字符(根据CSV语法)时,才使用以下转义:如果字段值包含逗号和/或双引号字符,则将整个字段用双引号括起来。如果字段原本已经包含双引号,则每个双引号都重复两次,以使其与其他额外的双引号区分开来,例如:
This " is a , special value"
将变成
"This "" is a , special value"""

对于要求我是清楚的,但我在编写确切格式方面遇到了困难。我已经了解了“quote”和“qmethod”选项,以下是我迄今为止所做的:


foo <- 
  data.table(
    'var1' = c('Test', 'Test\"3', "This \" is a , special value\""), 
    'var2' = c("This \" is a , special value\"", 'Bla\"', 'Test')
  )

write.csv(
  x = foo,
  file = 'test.csv', 
  quote = T,
  row.names = F
)

这将导致以下的.csv文件:
"var1","var2"
"Test","This "" is a , special value"""
"Test""3","Bla"""
"This "" is a , special value""","Test"

这不符合要求,因为每个值都被双引号包围。但请注意,它满足了在值内重复使用双引号的条件。

现在,如果我设置quote = F,我会得到:

var1,var2
Test,This " is a , special value"
Test"3,Bla"
This " is a , special value",Test

现在它不满足这两个条件。

我尝试了类似的方法使用write.table,但是遇到了同样的问题。我试着在谷歌上搜索,但是没有真正找到答案,因为对我来说,这似乎是一个特殊的问题。

有人能帮忙吗?非常感谢提前!:)

1个回答

4
你可以通过正则表达式进行更改,并将结果粘贴在一起形成一个大字符串:
output <- paste(names(foo), collapse = ",") |>
  paste0("\n") |>
  paste0(
    lapply(foo, function(x) {
      x <- gsub("\"", "\"\"", x)
      x[grepl("\"|,", x)] <- paste0("\"", x[grepl("\"|,", x)], "\"")
      x
    }) |>
    as.data.frame() |>
    apply(1, function(x) paste(x, collapse = ",")) |>
    paste(collapse = "\n")
  )

现在你可以使用writeLines来写出结果了。
writeLines(output, "myfile.csv")

导致的结果是

myfile.csv

var1,var2
Test,"This "" is a , special value"""
"Test""3","Bla"""
"This "" is a , special value""",Test

没有想到在这里使用writeLines的可能性。但我很高兴用write.csv或write.table不可能,这意味着我不是愚蠢的 ;) - Irgendniemand
非常感谢你 :) 没想到在这里可以使用writeLines的可能性。但我很高兴write.csv或write.table不支持这个功能,这意味着我并不愚蠢 ;) - Irgendniemand

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