2013-05-08 118 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位編碼器,您的隨機用戶提供的文本轉化爲簡單的字母數字字符串轉換。額外的好處是,一旦編碼,用戶真的很難創建可以打破常規的東西。

相關問題