【问题标题】:Write DataGridView to csv handling commas in values将 DataGridView 写入 csv 处理值中的逗号
【发布时间】:2014-10-27 00:49:20
【问题描述】:

我有一些来自这里的代码:DataGridView to CSV File 这是循环 DataGridView 数据(来自 Web 服务的源)以写入 csv。但是,我无法弄清楚如何处理包含逗号的变量。我知道应该对它们进行评论,但不确定如何将其用于现有循环。

写入还必须能够处理空和布尔字段。这就是为什么我一直在努力适应其他地方的代码。一如既往地感谢您的帮助。现有代码如下。

    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)。

【问题讨论】:

    标签: vb.net datagridview export-to-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 中打开它,输入一些包含逗号和/或双引号的数据,然后保存并保存然后在记事本中打开它。您会看到任何包含逗号或双引号的值都用双引号括起来,并且值中的任何双引号都用另一个双引号转义。在您的情况下,您可以像这样有选择性,但将所有内容用双引号括起来会更容易。这样做除了会增加文件的大小之外没有任何不良影响。

    【讨论】:

    • 这正是我所追求的,谢谢。但是,报价解决方案会产生错误“替换不是 system.array 的成员”。我的数据不应包含引用,但它可能对阅读此解决方案的其他人有用。
    • 我更新了最后一个代码 sn-p 以考虑到 rString 的数组,而不仅仅是 String。也就是说,您可能希望在填充 rows 的表达式中包含 Replace 调用,以避免以后再这样做。
    【解决方案2】:

    这不是一个简单的问题。一个好的开始是这个链接,它与你会发现的 CSV 规范差不多:http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm

    最好使用DataTable 设置数据,然后与DataGridView.DataSource = MyDataTable 绑定。

    IS 内置支持将 DataTable 导出为 XML - DataTable.WriteXml,这可能会满足您的需求。

    祝你好运!

    【讨论】:

    • 感谢您的回复。我当然可以从总体上了解更多关于 CSV 的信息,所以这很有用。
    猜你喜欢
    • 2011-09-26
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 2011-12-26
    相关资源
    最近更新 更多