2014-10-27 82 views
0

我在這裏有一些代碼:DataGridView to CSV File 這是循環DataGridView數據(來自Web服務的源)寫入csv。但是,我一直無法弄清楚如何處理包含逗號的變量。我知道他們應該被評論,但不知道如何將其應用到現有循環中。將DataGridView寫入到csv處理值中的逗號

寫入也必須能夠處理null和布爾字段。這就是爲什麼我一直在努力修改其他地方的代碼。援助始終如一現有的代碼如下。

Dim headers = (From header As DataGridViewColumn In DataGridView1.Columns.Cast(Of DataGridViewColumn)() _ 
      Select header.HeaderText).ToArray 
    Dim rows = From row As DataGridViewRow In DataGridView1.Rows.Cast(Of DataGridViewRow)() _ 
       Where Not row.IsNewRow _ 
       Select Array.ConvertAll(row.Cells.Cast(Of DataGridViewCell).ToArray, Function(c) If(c.Value IsNot Nothing, c.Value.ToString, """")) 
    Using sw As New IO.StreamWriter("csv.txt") 
     sw.WriteLine(String.Join(",", headers)) 
     For Each r In rows 
      sw.WriteLine(String.Join(",", r)) 
     Next 
    End Using 
    Process.Start("csv.txt") 

我無法更改分隔符,因爲這會影響後續自動使用該文件。 (輸出必須是csv)。

回答

1

您只需將至少包含逗號的值包含在雙引號中。讀取CSV文件的任何適當的例程應該讀取任何包在雙引號中的值作爲單個值,不管它是否包含逗號。以這種方式正確讀取CSV文件的示例是VB TextFieldParser類。考慮到這一點,改變這種:

sw.WriteLine(String.Join(",", r)) 

這樣:

sw.WriteLine("""" & String.Join(""",""", r) & """") 

,或者,如果躲過報價似乎令人困惑,這樣的:

sw.WriteLine(ControlChars.Quote & String.Join(ControlChars.Quote & "," & ControlChars.Quote, r) & ControlChars.Quote) 

我還要提到的是,剛就像在VB文字中一樣,雙引號需要在CSV文件中引用的字符串中轉義。考慮到這一點,如果有任何機會,你的價值可能包含一個雙引號,那麼你應該這樣做:

sw.WriteLine("""" & String.Join(""",""", r.Select(Function(s) s.Replace("""", """"""))) & """") 

順便說一句,看到這一切行動,你所要做的就是創建Windows資源管理器中的空白CSV文件,在Excel中打開它,輸入一些包含逗號和/或雙引號的數據,保存並在記事本中打開它。您會看到包含逗號或雙引號的任何值都用雙引號包裹,並且值中的任何雙引號都會用另一個雙引號轉義。在你的情況下,你可以選擇這樣的,但只是用雙引號將所有內容都包裹起來更容易。這樣做除了增加文件的大小之外沒有任何不良影響。

+0

這已經完成了我以後的工作,謝謝。然而,報價解決方案產生錯誤「替換不是system.array的成員」。我的數據不應包含引號,但可能對閱讀此解決方案的其他人有用。 – benj 2014-10-27 08:06:18

+0

我已經更新了最後一段代碼,考慮到'r'是一個'String'數組,而不是'String'。也就是說,您可能希望在填充行的表達式中包含'Replace'調用,以避免稍後再執行此操作。 – jmcilhinney 2014-10-27 08:42:16

0

這不是一個簡單的問題。良好的開端是這樣的鏈接,這是最接近爲CSV規範,你會發現:http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm

您還可以更好使用DataTable設置您的數據,然後用DataGridView.DataSource = MyDataTable結合。

IS內置支持導出數據表到XML - DataTable.WriteXml這可能會做你的需要。

祝你好運!

+0

謝謝你的回覆。我當然可以瞭解更多關於CSV的知識,所以這將是有用的。 – benj 2014-10-27 08:09:52