1

我正在创建一个 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
4

4 回答 4

2

我遇到的使用双引号作为分隔符和逗号作为分隔符的主要缺点是源数据有时包含它们,这在处理数据时经常会导致错误(除非您编写代码来处理它)。我宁愿根本不使用任何分隔符,而是使用管道而不是逗号来分隔值。虽然可以想象您的源数据可能包含管道,但它几乎不像用于分隔和分隔 CSV 文件中的数据的更常见字符那样可能。

于 2013-05-08T23:32:04.053 回答
2

缺点(因为您询问是否有)是无条件添加引号可能会增加 CSV 文件的大小、读取文件所需的时间以及处理文件时的内存占用。然而,除非内存和存储受到特别限制,否则实际影响很可能可以忽略不计。

CSV 格式没有权威标准,尽管RFC4180试图定义一个。RFC4180 在所有情况下都允许使用双引号,但需要注意的是某些系统可能不支持此约定:

每个字段可能包含也可能不包含在双引号中(但是某些程序,例如 Microsoft Excel,根本不使用双引号)。

如果 CSV 文件的使用者符合 RFC 的这一部分,那么将所有字段用双引号括起来就可以了。

于 2013-05-08T23:13:25.873 回答
1

我建议在字符串而不是数字周围使用双引号。您还需要编写一些代码来转义字符串中的双引号

例如:

1,"Charles ""Pretty Boy"" Floyd","1 Short St, Smallville"
2,"Charlie ""Lucky"" Luciano","1 Short St, Smallville"

当您考虑到它确实有效时,额外的开销是微不足道的。

于 2013-05-08T23:42:58.630 回答
0

我发现将源数据中的所有引号和逗号简单地替换为已知字符串(如~~~DoubleQuote~~~~~~SingleQuote~~~~~~Comma~~~. 一旦在源代码中替换了这些值,只需将值以引号逗号格式存储即可。这仍然是可读的。

如果您不关心人类的可重复性或针对您的存储值编写查询,那么您可以简单地使用 64 位编码器将您的随机用户提供的文本转换为简单的字母数字字符串。额外的好处是,一旦编码,用户就很难创建可以打破常规的东西。

于 2013-05-09T04:58:56.687 回答