在 R 中使用write.table
orwrite.csv
时,默认情况下会在所有非数字字段周围添加双引号,而不管正确解析 csv 文件是否实际需要引号。
以 Python 脚本为例:
import csv
f_out=open("pytest.csv", "w")
wri = csv.writer(f_out, delimiter=',')
wri.writerow(['c_numeric', 'c_str', 'c_str_spec'])
wri.writerow([11, "r1c2", "r1c3 nothing special"])
wri.writerow([21, "r2c2", "r2c3,with delim"])
wri.writerow([31, "r3c2", "r3c3\nwith carriage return"])
wri.writerow([41, "r4c2", "r3c3\"with double quote"])
f_out.close()
这会将以下内容输出到pytest.csv
:
c_numeric,c_str,c_str_spec
11,r1c2,r1c3 nothing special
21,r2c2,"r2c3,with delim"
31,r3c2,"r3c3
with carriage return"
41,r4c2,"r3c3""with double quote"
这是我所期望的,并且遵循 Excel 也将输出的内容。
现在让我们使用 R 处理这个文件,并使用和不使用引号编写:
df <- read.csv("pytest.csv")
write.csv(df, 'Rtest.csv', row.names=FALSE)
write.csv(df, 'Rtest_NQ.csv', row.names=FALSE, quote=FALSE)
这里是Rtest.csv
:
"c_numeric","c_str","c_str_spec"
11,"r1c2","r1c3 nothing special"
21,"r2c2","r2c3,with delim"
31,"r3c2","r3c3
with carriage return"
41,"r4c2","r3c3""with double quote"
请注意所有非数字字段周围的引号。
这里是Rtest_NQ.csv
:
c_numeric,c_str,c_str_spec
11,r1c2,r1c3 nothing special
21,r2c2,r2c3,with delim
31,r3c2,r3c3
with carriage return
41,r4c2,r3c3"with double quote
此文件在技术上已损坏,因为任何 csv 阅读器都无法读取它——因此不是一个好的选择。
我的问题:R 中是否有任何兼容 rfc4180 的编写器可以像 Excel 或 python csv 库以及大多数其他 rfc4180 兼容工具那样编写?