【问题标题】:Can't find/replace correctly无法正确找到/替换
【发布时间】:2017-10-24 07:09:44
【问题描述】:

我有一个 CSV 文件,我正试图从中删除 HTML 标记,并且所有行都返回。

使用<*> 进行查找/替换会返回“此公式有问题”错误。

尝试\<*> 得到错误“我们找不到要替换的东西。”

尝试这个 VBA 也无济于事 - 它运行成功,但所有标签仍然存在:

Sub t()
With Range("A1:AE60165")
    .Replace Chr(10), " "
    .Replace Chr(13), " "
    .Replace vbCr, " "
    .Replace vbLf, " "
    .Replace vbCrLf, " "
    .Replace "<*>", ""
End With
End Sub

该宏还删除任何换行符或回车符。同样用Char!10)Char(13) 进行查找/替换也不会做任何事情。

我尝试的最后一件事是Worksheetfunction.Clean(Range("A1")),它也没有任何作用。 但是如果在A2,我使用=CLEAN(A1),它会成功删除换行符。我不能在所有单元格上都这样做,因为数据集非常大。

我什至无法从所有单元格中成功删除@。我刚刚运行它,它删除了 23 个实例,但即使是我选择的单元格也有一个 @没有删除。

我怀疑这与 CSV 有关,因为我不知道它为什么如此复杂。数据量很大,因此函数可能不是最佳选择。

可能是一些 Unicode 类型问题?

编辑:FWIW,我正在使用 profiles.csv 找到 here,因为我学习 Python 只是为了玩。 Here's a pastebin 链接到少量数据,但我不确定它在该网站上的“翻译”效果如何。

【问题讨论】:

  • 您是否尝试将其作为正则表达式进行搜索。 <.> 应该获取正则表达式上下文中的所有 html 标签
  • @GerriePretorius - 我不太擅长正则表达式。我会搜索什么?我只是想删除所有换行符/回车符和任何 HTML 标签,即&lt;a href ...&gt;&lt;br&gt;&lt;/br&gt; 等。
  • <.> 这个正则表达式的含义如下: 以这个结尾所以只要确保你也有这个点
  • 如果您安装了 regexcoach,您可以在其中放入一些演示文本,它会突出显示与您的正则表达式匹配的文本,因此您可以查看它是否按照您的预期进行。
  • @GerriePretorius - 我尝试了&lt;.*&gt; 仍然没有,我得到“我们找不到任何可以替换的东西......”

标签: regex excel csv parsing vba


【解决方案1】:

尝试使用notepad++,它会容易得多,或者你可以在SQL中导入CSV并在那里进行替换

【讨论】:

  • 记事本++也找不到&lt;*&gt;...只找到了三个\n实例。
  • 啊!如果我打开 RegEx 检查,我可以成功删除 &lt;.*&gt;。我得看看如何删除新的换行符。
  • 太好了!尝试搜索 unicode Alt 0010 并用空格替换以删除换行符。打开搜索和替换框,在搜索字符串中按住 Alt 键并输入 0010 你不会在替换中看到任何字符,只需在搜索和替换中放置一个空格即可删除换行符
  • 如果此搜索技巧在 notepad++ 中有效,请尝试使用在 Excel 中删除标签的新文件,Excel 将找到 Alt0010 字符
  • 事实证明,如果您阅读 cmets,则使用 Notepad++ 删除 &lt;*&gt; 有效,我只是重新运行我的宏并关闭了 TextWrapping,并且它有效。感谢您的帮助!
【解决方案2】:

您可以在下面找到一个函数调用来说明该过程。您应该能够在循环中进行这些调用,最好是在数组循环中,然后将结果写回以提高性能。

调用示例

Sub test_RemoveHTML()
Dim s As String: s = "<b>xxx</b><div />"
MsgBox RemoveHTML(s)
End Sub

辅助功能

Function RemoveHTML(s As String) As String
' Purpose: remove HTML tags and comments from string via regular expression
On Error GoTo oops
Dim oRegEx   As Object       ' Late Binding
Set oRegEx = CreateObject("vbscript.regexp")

With oRegEx
    '.Pattern = "<[^>]+>"      'basic html pattern
    .pattern = "<!*[^<>]*>"    'html tags and comments
    .Global = True
    .IgnoreCase = True
    .MultiLine = True
End With

RemoveHTML = oRegEx.Replace(s, "")

leaveFunction:
On Error Resume Next
Set oRegEx = Nothing            ' clear memory
Exit Function

oops:
MsgBox "Error No " & Err.Number & " " & Err.Description, _
       vbExclamation, "RemoveHTML"
Resume leaveFunction
End Function

【讨论】:

  • 感谢您的想法。我有一堆数据(Range(A1:AE60000)),所以函数可能不是最好的选择。
  • 只保留 VBA:为什么不使用 Join 函数并在一个整体中执行正则表达式?
猜你喜欢
  • 2014-12-01
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 2018-07-10
  • 2015-01-17
  • 2021-09-24
相关资源
最近更新 更多