获取此CSV文件:
ID,NAME,VALUE
1,Blah,100
2,"Has space",200
3,"Ends with quotes"",300
4,""Surrounded with quotes"",300
它在大多数统计程序(R,SAS等)中都可以很好地加载,但是在Excel中,由于第三行有两个引号引起了误解。将最后引号转义为\"
在Excel中也将不起作用。到目前为止,我发现的唯一方法是用两个双引号替换一个双引号:
ID,NAME,VALUE
1,Blah,100
2,"Has space",200
3,"Ends with quotes""",300
4,"""Surrounded with quotes""",300
但这将使文件对于所有其他程序(R,SAS等)完全无用
是否可以格式化CSV文件,使字符串可以以与包围字符串相同的字符开头或结尾,从而可以在Excel和常用的统计软件中使用?
答案 0 :(得分:1)
您的第二个表示形式是生成CSV文件的常规方法,因此应易于在任何软件中使用。请参阅RFC 4180规范。 https://www.ietf.org/rfc/rfc4180.txt
因此,您的第二个示例表示此数据:
Obs id name value
1 1 Blah 100
2 2 Has space 200
3 3 Ends with quotes" 300
4 4 "Surrounded with quotes" 300
如果您想将其表示为带分隔符的文件,则不允许任何值包含分隔符(换句话说,不是作为标准CSV文件),而是看起来像这样:
id,name,value
1,Blah,100
2,Has space,200
3,Ends with quotes",300
4,"Surrounded with quotes",300
但是,如果要允许值包含定界符,则需要某种方法将嵌入式定界符与实际定界符区分开。因此,标准强制包含定界符的值将被引用。但是一旦这样做,您还需要在包含引号字符本身的字段周围添加引号(并使嵌入的引号加倍),以免产生模棱两可的文件。例如,第一个文件中第4个观察值中的引号看起来像是在值周围而不是部分值的可选引号。
许多程序尝试处理模棱两可的情况。例如,SAS不允许值包含嵌入的换行符,因此您在第一个示例文件中将始终获得四个观察值。
但是EXCEL允许在引用的值中嵌入行尾字符。因此,在您的原始文件中,第三个观察值中第二个字段的值看起来就像您在该值周围加上引号时将开始得到的内容:
Ends with quotes",300
4,"Surrounded with quotes",300
因此,只有3个观测值而不是每个3个场值的4个完整观测值,而最后一个观测值只有2个场值。
答案 1 :(得分:0)
这是由于Excel中"
的转义字符为""
:Escaping quotes and delimiters in CSV files with Excel
R中想到的一种快速,简单的解决方法是,先用readLines
读取csv的内容,然后用一个双引号替换双(转义)双引号,然后{{1 }}:
read.table