我有一个以CSV格式登录我们为某个日志操作写出来。但是,其中一个字段允许用户输入,我需要确保如果他们在我们解析它的字段中输入逗号并将其替换为,比如说,Excel将能够在其位置读取和显示逗号(因此csv读者不会认为它是列的结尾)。
目前我将逗号替换为,
,但在Excel中显示为文字字符串。
是否有标准方法可以在不使用实际逗号字符的情况下在CSV文件中显示逗号?即使只适用于excel的解决方案也可以使用,因为我们的大多数客户都将使用Excel来查看此文件。
答案 0 :(得分:18)
处理嵌入式逗号的最佳方法是正确引用CSV文件:
示例:
乔史密斯,“Joe Smith,Jr。”,“Joe”“The Man”“Smith,Jr。”
我写了一个扩展方法来帮助解决这个问题:
static public string CsvQuote(this string text)
{
if (text == null) return string.Empty;
bool containsQuote = false;
bool containsComma = false;
int len = text.Length;
for (int i = 0; i < len && (containsComma == false || containsQuote == false); i++)
{
char ch = text[i];
if (ch == '"')
{
containsQuote = true;
}
else if (ch == ',' || char.IsControl(ch))
{
containsComma = true;
}
}
bool mustQuote = containsComma || containsQuote;
if (containsQuote)
{
text = text.Replace("\"", "\"\"");
}
// Quote the cell and replace embedded quotes with double-quote or just return as is
return mustQuote ? "\"" + text + "\"" : text;
}
用法:
logger.Write(myString.CsvQuote());
var csv = string.Join(",", listOfStrings.Select(CsvQuote))
答案 1 :(得分:0)
CSV也是“字符分隔值”,不仅是逗号。
您可以使用任何字符作为分隔符,但tab
或\t
广泛用于此,
因为它通常不在用户输入中使用。
CSV的RFC为RFC 4180
它建议使用数据字段和字段分隔符。这是原文, 请注意(5)
中Microsoft Excel的特殊部分5. Each field may or may not be enclosed in double quotes (however some programs, such as Microsoft Excel, do not use double quotes at all). If fields are not enclosed with double quotes, then double quotes may not appear inside the fields. For example: "aaa","bbb","ccc" CRLF zzz,yyy,xxx 6. Fields containing line breaks (CRLF), double quotes, and commas should be enclosed in double-quotes. For example: "aaa","b CRLF bb","ccc" CRLF zzz,yyy,xxx 7. If double-quotes are used to enclose fields, then a double-quote appearing inside a field must be escaped by preceding it with another double quote. For example: "aaa","b""bb","ccc"
请注意,Excel识别开箱即用的标签
答案 2 :(得分:0)
您可以在整个字段周围加上引号。大多数CSV解析器都会理解逗号是数据的一部分而不是字段的结尾。
或使用其他分隔符。这将要求您使用Excel中的文本导入向导,而不是直接打开文件。我通常使用~
或|
。
答案 3 :(得分:0)
在引号内包含您的字符串将允许您使用逗号。
"please sir,", can I, have some more?