我正在创建一个CSV文件,以便上传到一个可以投放合适的网站,如果有一个未转义的完整停止。
在试图找出哪些字段需要逃避时,我有一个头疼的乐趣,学习一点正则表达式,但这是没有意义的吗?是否有任何理由不将每个字段用双引号括起来并用它完成?
这似乎有点矫枉过正,但随后可能会搜索每个字符串更难以解决,呵呵。
这是我的功能:
Private Sub WriteToCSVFile(ByVal s As String(,), ByVal sFileName As String)
Dim sb As New System.Text.StringBuilder
For i As Integer = 0 To s.GetUpperBound(0)
For j As Integer = 0 To s.GetUpperBound(1)
If Regex.Match(s(i, j), "^[\w ]*$").Success Then
sb.Append(s(i, j) & IIf(j = s.GetUpperBound(1), "", ","))
Else
sb.Append("""" & s(i, j) & IIf(j = s.GetUpperBound(1), """", ""","))
End If
Next
sb.AppendLine()
Next
System.IO.File.WriteAllText(Application.StartupPath & "\" & sFileName, sb.ToString)
End Sub
答案 0 :(得分:2)
使用双引号作为分隔符和逗号作为分隔符时遇到的主要缺点是源数据有时包含它们,这通常会在处理数据时导致错误(除非您编写代码来处理它)。我不想使用任何分隔符,而是使用管道而不是逗号来分隔值。虽然可以想象您的源数据可能包含管道,但它几乎不像用于在CSV文件中分隔和分隔数据的更常见字符。
答案 1 :(得分:1)
缺点(因为您询问是否存在)是无条件地添加引号可能会增加CSV文件的大小,读取文件所花费的时间以及处理文件时的内存占用量。但是,除非内存和存储受到特别限制,否则实际影响很可能是微不足道的。
虽然RFC4180尝试定义CSV格式,但没有CSV格式的权威标准。 RFC4180允许在所有情况下使用双引号,但需要注意的是某些系统可能不支持此约定:
每个字段可能包含也可能不包含在双引号中(但是 某些程序(如Microsoft Excel)不使用双引号 在所有)。
如果CSV文件的使用者符合RFC的这一部分,那么用双引号括起所有字段就可以了。
答案 2 :(得分:1)
我建议在字符串周围使用双引号,而不是在数字周围。您还需要编写一些代码,这些代码也会在字符串中删除双引号。
例如:
1,"Charles ""Pretty Boy"" Floyd","1 Short St, Smallville"
2,"Charlie ""Lucky"" Luciano","1 Short St, Smallville"
当你考虑到它确实有效时,额外的开销是微不足道的。
答案 3 :(得分:0)
我发现使用~~~DoubleQuote~~~
,~~~SingleQuote~~~
和~~~Comma~~~
等已知字符串简单地替换源数据中的所有引号和逗号更容易。一旦在源代码中替换它们,就可以用引号逗号格式存储值。哪个仍然可读。
如果您不关心人类的能力或针对存储的值编写查询,那么您可以简单地使用64位编码器将随机用户提供的文本转换为简单的字母数字字符串。额外的好处是,一旦编码,用户就很难创造出可能破坏常规的东西。