VBA - 替换CSV中的逗号不在引号内

Posted

技术标签:

【中文标题】VBA - 替换CSV中的逗号不在引号内【英文标题】:VBA - Replacing commas in CSV not inside quotes 【发布时间】:2016-02-16 13:42:52 【问题描述】:
  Filename = Dir(Filepath & "\" & "*.csv")
    While Filename <> ""
        SourceFile = Filepath & "\" & Filename
        TargetFile = SavePath & "\" & Replace(Filename, ".csv", ".txt")

        OpenAsUnicode = False

        Dim objFSO: Set objFSO = CreateObject("Scripting.FileSystemObject")
        'Detect Unicode Files
        Dim Stream: Set Stream = objFSO.OpenTextFile(SourceFile, 1, False)
        intChar1 = Asc(Stream.Read(1))
        intChar2 = Asc(Stream.Read(1))
        Stream.Close
        If intChar1 = 255 And intChar2 = 254 Then
            OpenAsUnicode = True
        End If

        'Get script content
        Set Stream = objFSO.OpenTextFile(SourceFile, 1, 0, OpenAsUnicode)
        arrData = Stream.ReadAll()
        Stream.Close

        'Create output file
        Dim objOut: Set objOut = objFSO.CreateTextFile(TargetFile)
        objOut.Write Replace(Replace(arrData,",", "#|#"), Chr(34), "")  '-- This line is working fine but it is replacing all the commas inside the text qualifier as well..
        objOut.Close

        Filename = Dir

    Wend

在上面的代码中,objOut.Write Replace(Replace(arrData,",", "#|#"), Chr(34), "") 行将所有逗号替换为#|#,包括里面的逗号string.so 我只想替换不在双引号中的逗号。

包含字符串的文件 "A","B,C",D

我需要的结果是 A#|#B,C#|#D

提前感谢您的帮助。

【问题讨论】:

这是谷歌上的第一首热门歌曲。请先搜索。 ***.com/questions/6780765/… 谢谢,但是您提供的链接将更改单个字符串的分隔符如何将其应用于循环中的多个文件.. 如果您可以更改我的代码,我不是 VBA 专家很大的帮助... 改变你替换为用#|#替换“,”而不是仅仅替换, Mathew - 抱歉,我没有正确回答您的问题 你到底想做什么?用井号重写文件的目的是什么? 【参考方案1】:

怎么样?

objOut.Write Mid(Replace(Replace(arrData,""",""", "#|#"), Chr(34), ""), 2)

基本上,现在将"," 交换为#|#。但这还不够,因为文件以" 开头。因此,正在使用Mid() 函数消除这个问题。如果文件也以" 结尾,那么您也必须对其进行调整。

基于 cmets 中提到的速度问题,这里是我用来测试此解决方案的完整代码:

Option Explicit
Option Compare Text

Public Sub ConvertFile()
Dim lngRowNumber As Long
Dim strLineFromFile As String
Dim strSourceFile As String
Dim strDestinationFile As String

strSourceFile = "C:\tmp\Extract.txt"
strDestinationFile = "C:\tmp\Extract_b.txt"

Open strSourceFile For Input As #1
Open strDestinationFile For Output As #2

lngRowNumber = 0

Do Until EOF(1)
    Line Input #1, strLineFromFile
    strLineFromFile = Mid(Replace(strLineFromFile, """,""", "#|#"), 2)
    Write #2, strLineFromFile
    strLineFromFile = vbNullString
Loop

Close #1
Close #2

End Sub

测试文件大小为 350 MB,行数略高于 400 万行。代码不到一分钟就完成了。

【讨论】:

这行不通。我有 10000 行的文件,其中 3000 行在双引号内有逗号。 我不确定您在寻找什么样的性能。但是使用上面的代码,我能够在不到一分钟的时间内转换一个 350 MB 的文件,其中包含 420 万行。 见下面的行 COLUMN_TYPE,12,04-Feb-08,121,08-Dec-99,1,121,V,"A,B" 我需要结果为 COLUMN_TYPE#|#12#|#04- 2-08#|#121#|#08-12-99#|#1#|#121#|#V#|#A,B 看来你正在改变你的问题。然而,如果你在一个文件中有几种不同的格式(最初询问的解析情况和这个新的),那么它会变得很棘手,你必须分析每一行以找出需要替换行的哪一部分以及采用哪种格式。无论如何,上述解决方案回答了您最初的问题。所以,请将问题标记为已关闭。

以上是关于VBA - 替换CSV中的逗号不在引号内的主要内容,如果未能解决你的问题,请参考以下文章

Python替换引号内的',',但保留其他逗号,然后删除字符串中的引号

Clojure 中的 CSV 解析器需要避免引号中的逗号

双引号内带有逗号和字符串的 C++ CSV 行

Clojure CSV 解析引号中的逗号

如何用逗号分割字符串而不在perl的引号内包含逗号?

GROOVY - 解析CSV:忽略双引号内的逗号