2013-05-08 35 views
1

我创建一个CSV文件上传到网站抛出一个合适的,如果有这么多作为一个转义句号。是否有理由不在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

您仍然需要转义双引号 – CodesInChaos 2013-05-08 22:24:48

+1

没有理由不应引用任何/所有“文本”字段。某些程序(旧版本的Excel)会将带引号的字段视为文本,而不管其内容(例如数字)如何,以便可能会或可能不会成为您的问题。 – 2013-05-08 22:25:20

回答

1

一个缺点(既然你问如果有的话)是加上引号无条件可能增加的CSV文件的大小,读取文件所花费的时间,以及内存占用量正在处理文件。但是,除非内存和存储受到特别限制,否则实际影响可能可以忽略不计。

没有为CSV格式没有权威的标准,虽然RFC4180试图界定之一。 RFC4180允许在所有情况下的双引号,需要提醒的是有些系统可能不支持这种约定:

每场可以或不可以用双引号(但 一些程序,如Microsoft Excel,做根本不使用双引号 )。

如果CSV文件的使用者符合RFC的这一部分,那么用双引号括住所有的字段是没问题的。

2

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

1

我建议使用字串,而不是围绕数字双引号。您需要编写一些代码,以便在的字符串中跳出双引号

例如:

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

的额外开销是微不足道的,当你考虑到它的实际工作。

0

我发现使用已知字符串(如~~~DoubleQuote~~~,~~~SingleQuote~~~~~~Comma~~~)简单地替换我的源数据中的所有引号和逗号更容易。一旦这些在源代码中被替换,这是一个简单的问题,以逗号格式存储值。这仍然是可读的。

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

相关问题