我在我的CSV中有这样一行:

“三星U600 24”“10000003409”“1”“10000003427”

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

三星U600 24",10000003409"

我试着在英寸引号前放一个反斜杠,但我只是在名称中得到了一个反斜杠:

三星U600 24\"

有没有办法在CSV中正确地转义这个,这样值就会是三星U600 24”,或者我必须在处理器中正则表达式?


当前回答

因为没有人提到过我通常的做法,我就把它打下来。当有一个棘手的字符串时,我甚至懒得转义它。

我所做的只是base64_encode和base64_decode,也就是说,在写入CSV行之前将值编码为Base64,当我想读取它时,解码。

对于你的例子,假设它是PHP:

$csvLine = [base64_encode('Samsung U600 24"'),"10000003409","1","10000003427"];

当我想求值时,我做相反的事。

$value = base64_decode($csvLine[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() );

因为没有人提到过我通常的做法,我就把它打下来。当有一个棘手的字符串时,我甚至懒得转义它。

我所做的只是base64_encode和base64_decode,也就是说,在写入CSV行之前将值编码为Base64,当我想读取它时,解码。

对于你的例子,假设它是PHP:

$csvLine = [base64_encode('Samsung U600 24"'),"10000003409","1","10000003427"];

当我想求值时,我做相反的事。

$value = base64_decode($csvLine[0])

我只是不想经历这种痛苦。

如果值包含逗号、换行符或双引号,则字符串必须用双引号括起来。例如:“换行字符在这个字段\n”。

您可以使用下面的在线工具来转义“”和操作符。 https://www.freeformatter.com/csv-escape.html#ad-output

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

使用fputcsv()写入,fgetcsv()读取,这将处理所有问题。

我用Java写过。

public class CSVUtil {
    public static String addQuote(
            String pValue) {
        if (pValue == null) {
            return null;
        } else {
            if (pValue.contains("\"")) {
                pValue = pValue.replace("\"", "\"\"");
            }
            if (pValue.contains(",")
                    || pValue.contains("\n")
                    || pValue.contains("'")
                    || pValue.contains("\\")
                    || pValue.contains("\"")) {
                return "\"" + pValue + "\"";
            }
        }
        return pValue;
    }

    public static void main(String[] args) {
        System.out.println("ab\nc" + "|||" + CSVUtil.addQuote("ab\nc"));
        System.out.println("a,bc" + "|||" + CSVUtil.addQuote("a,bc"));
        System.out.println("a,\"bc" + "|||" + CSVUtil.addQuote("a,\"bc"));
        System.out.println("a,\"\"bc" + "|||" + CSVUtil.addQuote("a,\"\"bc"));
        System.out.println("\"a,\"\"bc\"" + "|||" + CSVUtil.addQuote("\"a,\"\"bc\""));
        System.out.println("\"a,\"\"bc" + "|||" + CSVUtil.addQuote("\"a,\"\"bc"));
        System.out.println("a,\"\"bc\"" + "|||" + CSVUtil.addQuote("a,\"\"bc\""));
    }
}