我正在寻找关于如何处理正在创建的csv文件的建议,然后由我们的客户上传,并且可能在值中有逗号,如公司名称。
我们正在考虑的一些想法是:带引号的标识符(value "," values ","等等)或使用|代替逗号。最大的问题是我们必须让它变得简单,否则客户就不会这么做。
我正在寻找关于如何处理正在创建的csv文件的建议,然后由我们的客户上传,并且可能在值中有逗号,如公司名称。
我们正在考虑的一些想法是:带引号的标识符(value "," values ","等等)或使用|代替逗号。最大的问题是我们必须让它变得简单,否则客户就不会这么做。
当前回答
public static IEnumerable<string> LineSplitter(this string line, char
separator, char skip = '"')
{
var fieldStart = 0;
for (var i = 0; i < line.Length; i++)
{
if (line[i] == separator)
{
yield return line.Substring(fieldStart, i - fieldStart);
fieldStart = i + 1;
}
else if (i == line.Length - 1)
{
yield return line.Substring(fieldStart, i - fieldStart + 1);
fieldStart = i + 1;
}
if (line[i] == '"')
for (i++; i < line.Length && line[i] != skip; i++) { }
}
if (line[line.Length - 1] == separator)
{
yield return string.Empty;
}
}
其他回答
您可以使用其他“分隔符”,如“;”或“|”,但最简单的可能只是引用,这是大多数(体面的)CSV库和大多数体面的电子表格所支持的。
有关CSV分隔符的更多信息以及描述分隔符和引用的标准格式的规范,请参阅此网页
实际上,CSV格式有一个规范,RFC 4180以及如何处理逗号:
包含换行符(CRLF)、双引号和逗号的字段应该用双引号括起来。
http://tools.ietf.org/html/rfc4180
所以,要有值foo和bar,baz,你这样做:
foo,"bar,baz"
另一个需要考虑的重要需求(同样来自规范):
如果使用双引号括起字段,则使用双引号 在字段中出现时,必须在字段前面加上 另一个双引号。例如: “aaa级”、“b”“bb”、“ccc”
我使用Csvreader库,但通过使用它,我从列值中的逗号(,)爆炸获得数据。
所以如果你想要插入CSV文件数据,其中包含逗号(,)的大部分列值,你可以使用下面的函数。 作者链接=> https://gist.github.com/jaywilliams/385876
function csv_to_array($filename='', $delimiter=',')
{
if(!file_exists($filename) || !is_readable($filename))
return FALSE;
$header = NULL;
$data = array();
if (($handle = fopen($filename, 'r')) !== FALSE)
{
while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
{
if(!$header)
$header = $row;
else
$data[] = array_combine($header, $row);
}
fclose($handle);
}
return $data;
}
这里有一个简单的变通方法:
您可以使用希腊小写数字符号(U+0375)
看上去就像这样
使用这种方法也可以节省很多资源…
我发现的最简单的解决方案是LibreOffice使用的:
替换所有“by”字面值 在字符串周围加上双引号
你也可以使用Excel使用的:
替换所有字面的" by " 在字符串周围加上双引号
注意,其他人建议只执行上面的第2步,但这对于“后面跟着一个,”的行不起作用,就像在CSV中,你想要有一个字符串hello”,world的单列,因为CSV会这样读:
"hello",world"
它被解释为有两列的行:hello和world"