正确转义CSV中的双引号


164

我的CSV中有这样一行:

"Samsung U600 24"","10000003409","1","10000003427"

旁边24的引号用于表示英寸,而该引号旁边的引号用于关闭该字段。我正在读取的行,fgetcsv但解析器犯了一个错误,并将值读取为:

Samsung U600 24",10000003409"

我尝试在英寸引号前加一个反斜杠,但随后我在名称中得到一个反斜杠:

Samsung U600 24\"

有没有办法在CSV中正确地对此进行转义,以使该值为Samsung U600 24",或者我是否必须在处理器中对其进行正则表达式?


21
只需双倍报价即可。仅此
而已

Answers:


281

使用2个引号:

"Samsung U600 24"""

101
RFC-4180段落“如果使用双引号将字段括起来,则必须在字段内部出现双引号,方法是在其前面加上另一个双引号,以对其进行转义。”
将于2015年

4
如tommed所说,您只需要添加一个双引号即可转义双引号。您可以使用称为csvfix的命令行工具来检测任何不符合要求的行:csvfix check -nl -v [filename]
Sam Critchley

2
@SamCritchley我只看到一个双引号被用来在这里转义。通过“使用2个引号”,user4035表示应将1个引号替换为2个引号。通过用双引号转义双引号,可以有效地创建双引号对(2个双引号)。最后看到的最后一个报价是终止该字段。
Zenexer

1
单双双单双引号是必需的,但前提是要加双单双引号...祝您好运!
Daniel Waltrip '18年

14

不仅是双引号,还需要单引号('),双引号("),反斜杠(\)和NUL(NULL字节)。

使用fputcsv()写,fgetcsv()读,将采取一切照顾。


3
的文档页面fputcsv()此注释显示了fputcsv()当您想以csv格式而不是实际文件输出到浏览器时如何使用。
dennisschagt

15
@Angelin Nadar,能否请您为要求双引号,反斜杠和NUL加倍的声明添加消息来源?我在RFC-4180中找不到它。
Petr'PePa'Pavel

2
您实际上不需要转义单引号等。适当的CSV文件甚至不需要在仅包含单引号的字段周围添加双引号。如果正确实施了CSV阅读器,则即使带有这些符号,也应正确阅读文件。
xji

4
为什么这个答案曾经被投票过?关于转义字符的评论从未被备份过,原始问题也不是关于PHP的。仅当程序(例如Open Office)允许您更改字符串定界符(且仅对于选定的定界符)时,这才是正确的。
戴夫F

0

我知道这是一篇旧文章,但是这是我使用扩展方法在C#中解决它的方法(以及将空值转换为空字符串)。

创建一个类似于以下内容的静态类:

    /// <summary>
    /// Wraps value in quotes if necessary and converts nulls to empty string
    /// </summary>
    /// <param name="value"></param>
    /// <returns>String ready for use in CSV output</returns>
    public static string Q(this string value)
    {
        if (value == null)
        {
            return string.Empty;
        }
        if (value.Contains(",") || (value.Contains("\"") || value.Contains("'") || value.Contains("\\"))
        {
            return "\"" + value + "\"";
        }
        return value;
    }

然后,对于要写入CSV的每个字符串,而不是:

stringBuilder.Append( WhateverVariable );

您只需:

stringBuilder.Append( WhateverVariable.Q() );

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.