我正在寻找关于如何处理正在创建的csv文件的建议,然后由我们的客户上传,并且可能在值中有逗号,如公司名称。
我们正在考虑的一些想法是:带引号的标识符(value "," values ","等等)或使用|代替逗号。最大的问题是我们必须让它变得简单,否则客户就不会这么做。
我正在寻找关于如何处理正在创建的csv文件的建议,然后由我们的客户上传,并且可能在值中有逗号,如公司名称。
我们正在考虑的一些想法是:带引号的标识符(value "," values ","等等)或使用|代替逗号。最大的问题是我们必须让它变得简单,否则客户就不会这么做。
当前回答
首先,让我们问问自己,“为什么我们觉得需要在CSV文件中以不同的方式处理逗号?”
对我来说,答案是:“因为当我将数据导出到CSV文件时,字段中的逗号消失了,我的字段被分隔成多个字段,其中逗号出现在原始数据中。”(这是因为逗号是CSV字段分隔符。)
根据您的情况,分号也可以用作CSV字段分隔符。
根据我的要求,我可以使用一个字符,例如,单个低9引号,它看起来像一个逗号。
所以,下面是你在Go中如何做到这一点:
// Replace special CSV characters with single low-9 quotation mark
func Scrub(a interface{}) string {
s := fmt.Sprint(a)
s = strings.Replace(s, ",", "‚", -1)
s = strings.Replace(s, ";", "‚", -1)
return s
}
Replace函数中的第二个逗号字符是十进制8218。
请注意,如果您的客户端可能只有ascii文本阅读器,那么这个十进制8218字符看起来不会像逗号。如果这是您的情况,那么根据RFC 4128,我建议用逗号(或分号)和双引号包围字段:https://www.rfc-editor.org/rfc/rfc4180
其他回答
使用制表符(\t)分隔字段。
首先,让我们问问自己,“为什么我们觉得需要在CSV文件中以不同的方式处理逗号?”
对我来说,答案是:“因为当我将数据导出到CSV文件时,字段中的逗号消失了,我的字段被分隔成多个字段,其中逗号出现在原始数据中。”(这是因为逗号是CSV字段分隔符。)
根据您的情况,分号也可以用作CSV字段分隔符。
根据我的要求,我可以使用一个字符,例如,单个低9引号,它看起来像一个逗号。
所以,下面是你在Go中如何做到这一点:
// Replace special CSV characters with single low-9 quotation mark
func Scrub(a interface{}) string {
s := fmt.Sprint(a)
s = strings.Replace(s, ",", "‚", -1)
s = strings.Replace(s, ";", "‚", -1)
return s
}
Replace函数中的第二个逗号字符是十进制8218。
请注意,如果您的客户端可能只有ascii文本阅读器,那么这个十进制8218字符看起来不会像逗号。如果这是您的情况,那么根据RFC 4128,我建议用逗号(或分号)和双引号包围字段:https://www.rfc-editor.org/rfc/rfc4180
您可以在字段周围加上双引号。我不喜欢这种方法,因为它增加了另一个特殊字符(双引号)。只需定义一个转义字符(通常是反斜杠),并在需要转义的地方使用它:
data,more data,more data\, even,yet more
您不必尝试匹配引号,而且需要解析的异常也更少。这也简化了您的代码。
我通常在CSV文件解析例程中这样做。假设“line”变量是CSV文件中的一行,所有列的值都用双引号括起来。执行以下两行代码后,您将在“values”集合中获得CSV列。
// The below two lines will split the columns as well as trim the DBOULE QUOTES around values but NOT within them
string trimmedLine = line.Trim(new char[] { '\"' });
List<string> values = trimmedLine.Split(new string[] { "\",\"" }, StringSplitOptions.None).ToList();
您可以使用其他“分隔符”,如“;”或“|”,但最简单的可能只是引用,这是大多数(体面的)CSV库和大多数体面的电子表格所支持的。
有关CSV分隔符的更多信息以及描述分隔符和引用的标准格式的规范,请参阅此网页