【问题标题】:How to add quotes for every string value in a csv file via Excel VBA?如何通过 Excel VBA 为 csv 文件中的每个字符串值添加引号?
【发布时间】:2016-10-05 11:53:05
【问题描述】:

我有一个 csv 文件,我需要一个 VBA 函数来为文件中的每个字符串值添加引号,这样就可以像

vertical,device_name,value
mobile,Apple iPad,0
mobile,HTC,3

看起来像

"vertical","device_name","value"
"mobile","Apple iPad",0
"mobile","HTC",3

到目前为止,我发现的是一个宏,

Sub QuotesAroundText()
    Dim c As Range
    For Each c In Selection
        If Not IsNumeric(c.Value) Then
            c.Value = """" & c.Value & """"
        End If
    Next c
End Sub

这几乎完全符合我的需要 - 它添加引号,但不是字符串,而是 Excel 单元格。这意味着,此宏在 xlsx 文件中可以正常工作,但在 csv 文件中不能正常工作。

所以我需要一个 vba 代码,它不是在单元格中添加引号,而是在逗号之间的字符串中添加引号。

【问题讨论】:

    标签: vba excel csv macros


    【解决方案1】:

    通过模拟字符串生成器,我能够在 3 秒多的时间内处理包含 59,507 行 x 9 列的 CSV 文件。这个过程比标准串联要快得多。

    这个函数是根据我对Turn Excel range into VBA string的回答修改的

    测试

    Sub TestProcessCSVFile()
        Dim s As String
        Dim Start: Start = Timer
    
        ProcessCSVFile "C:\Users\Owner\Downloads\SampleCSVFile_53000kb.csv", "C:\Users\Owner\Downloads\_temp.csv"
    
        Debug.Print "Execution Time: "; Timer - Start; "Second(s)"
    
    End Sub
    

    代码

    Sub ProcessCSVFile(OldFile As String, NewFile As String)
        Dim Data As String, text As String
        Dim vCell
        Dim length As Long
    
        Open OldFile For Binary As #1
        Data = Space$(LOF(1))
        Get #1, , Data
        Close #1
    
        text = Space(Len(Data) * 1.5)
    
        For Each vCell In Split(Replace(Data, vbCrLf, "," & vbCrLf & ","), ",")
            If Len(vCell) + length + 5 > Len(text) Then text = text & Space(Len(Data) * 0.1)
    
            If vCell = vbCrLf Then
                Mid(text, length, 1) = vbCrLf
            ElseIf IsNumeric(vCell) Then
                Mid(text, length + 1, Len(vCell) + 1) = vCell & ","
                length = length + Len(vCell) + 1
            Else
                Mid(text, length + 1, Len(vCell) + 3) = Chr(34) & vCell & Chr(34) & ","
                length = length + Len(vCell) + 3
            End If
    
        Next
    
        Open NewFile For Output As #1
        Print #1, Left(text, length - 1)
        Close #1
    
    End Sub
    

    结果

    【讨论】:

      【解决方案2】:

      使用行输入读取文本文件,然后根据您的需要定制以下过程:

      Sub y()
      a = "a,b,c,d"
      
      'Split into 1d Array
      b = Split(a, ",", , vbTextCompare)
      
      'for each element in array add the quotes
      For c = 0 To UBound(b)
          b(c) = """" & b(c) & """"
      Next c
      
      'join the product up
      d = Join(b, ",")
      
      'Print her out
      Debug.Print d
      End Sub
      

      【讨论】:

        【解决方案3】:

        使用 workbooks.opentext 文件名:="你的 csv 文件和路径", 它将打开 csv 并将它们分成单元格, 然后应用您的宏并再次保存为 csv

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-05-21
          • 2018-11-28
          • 2012-02-19
          相关资源
          最近更新 更多