如何在Excel中使用VBA和RegEx来替换数据?

时间:2016-11-07 08:06:55

标签: regex excel vba excel-vba

我有一个很大的.csv文件(~600k行,56Mo),里面有数据库行(每行都有一个id,一个客户端名称,一个客户端地址,一个客户端生日日期,等等)。问题在于,在某些行上,某些数据写得很糟糕(不应该使用逗号,这会使列陷入混乱)。

我猜我必须做一些RegEx来检测有问题的行,并用短划线或任何东西替换错误的逗号。我跟着this article,经过一些尝试后,我让他去发现混乱的线条。

Private Sub simpleRegex()
Dim strPattern As String: strPattern = "[^a-zA-Z0-9_,\-]([A-z]+)\,[^a-zA-Z0-9_,\-]([A-z]+)"

Dim strReplace As String: strReplace = "[^a-zA-Z0-9_,\-][A-z]+\-[^a-zA-Z0-9_,\-][A-z]"

Dim regEx As Object
Set regEx = CreateObject("VBScript.RegExp")
Dim strInput As String
Dim Myrange As Range

Set Myrange = ActiveSheet.Range("A1:A2000")

For Each cell In Myrange
    If strPattern <> "" Then
        strInput = cell.Value

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With

        If regEx.Test(strInput) Then
            MsgBox (regEx.Replace(strInput, strReplace))
        Else

        End If
    End If
Next End Sub

问题是,如果我想用唯一值,预定义字符串(如strReplace =&#34;替换字&#34;)更改cibled行,此解决方案有效。我想要的是能够定位与我的模式匹配的一系列字符,并且只替换其中的一个字符(逗号)。一个例子是:

728,"HAY,HAYE",Marie,François,RAUTUREAU,85,29/05/1856,68;

进入:

728,"HAY-HAYE",Marie,François,RAUTUREAU,85,29/05/1856,68;

你有解决方案吗?

(抱歉,如果英语不好,那不是我的母语)。

3 个答案:

答案 0 :(得分:1)

您可以使用(?<=(Your Word))来捕获特定字词后的特定字符。在您的情况下,此代码将帮助您找到逗号:

(?<=(HAY))\,

<强>更新

试试这个,我也更新了演示:

,(?=[^"]+")

演示: https://regex101.com/r/0rtcFt/6

答案 1 :(得分:1)

此处的正确方法(因为您commented双引号仅显示为字段分隔符)是将双引号子字符串与简单的"[^"]+"正则表达式匹配,并仅在内部使用连字符替换逗号匹配

以下是示例代码:

Sub CallbackTest()
Dim rxStr As RegExp
Dim s As String
Dim m As Object

s = """SOME,MORE,HERE"",728,""HAY,HAYE"",Marie,François,RAUTUREAU,85,29/05/1856,68;"

Set rxStr = New RegExp
rxStr.pattern = """[^""]+"""
rxStr.Global = True

For Each m In rxStr.Execute(s)
   s = Left(s, m.FirstIndex) & Replace(m.Value, ",", "-") & Mid(s, m.FirstIndex + Len(m.Value) + 1)
Next m
Debug.Print s              ' Print demo results
' => "SOME-MORE-HERE",728,"HAY-HAYE",Marie,François,RAUTUREAU,85,29/05/1856,68;

End Sub

答案 2 :(得分:1)

如果我说错了,那就根本不需要Regex

使用简单的Split,您也可以这样做。

Private Sub simpleReplace()
  Dim str() As String, cell As Variant, Myrange As Range, i As Long
  Set Myrange = ActiveSheet.Range("A1:A2000")
  For Each cell In Myrange
    str = Split(cell.Value, """")
    If UBound(str) Then
      For i = 1 To UBound(str) Step 2
        str(i) = Replace(str(i), ",", "-")
      Next
      cell.Value = Join(str, """")
    End If
  Next
End Sub

这将拆分您的728,"HAY,HAYE",Marie,François,RAUTUREAU,85,29/05/1856,68; 成:

(0) 728,
(1) HAY,HAYE
(2) ,Marie,François,RAUTUREAU,85,29/05/1856,68;

现在Split(奇数)的每一秒都将通常包含在" 中。所以剩下的就是Replace那里的逗号并再次将它推入单元格。

如果找不到",那么它将跳过此行(因为上限为0)

如果您仍然有任何问题,或者这不是您想要的,请告诉:)