我在我的CSV中有这样一行:
“三星U600 24”“10000003409”“1”“10000003427”
24旁边的引号用于表示英寸,而该引号旁边的引号则关闭字段。我用fgetcsv读取行,但解析器犯了一个错误,将值读取为:
三星U600 24",10000003409"
我试着在英寸引号前放一个反斜杠,但我只是在名称中得到了一个反斜杠:
三星U600 24\"
有没有办法在CSV中正确地转义这个,这样值就会是三星U600 24”,或者我必须在处理器中正则表达式?
我在我的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\""));
}
}