首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速删除(非常大的)字符串中不必要的空格。

快速删除(非常大的)字符串中不必要的空格。
EN

Stack Overflow用户
提问于 2018-02-10 13:36:29
回答 1查看 1.5K关注 0票数 5

我正在使用VBA中非常大的(45,000,000+字符)字符串,我需要删除多余的白空间

一个空格(也就是ASCII代码32)是可以的,但是任何有两个或多个连续空格的部分都应该减少到一个。

我发现了一个类似的问题这里,尽管OP对“超长字符串”的定义只有39,000个字符。接受的答案是一个使用Replace的循环。

代码语言:javascript
复制
Function MyTrim(s As String) As String
    Do While InStr(s, "  ") > 0
        s = Replace$(s, "  ", " ")
    Loop
    MyTrim = Trim$(s)
End Function

我尝试过这种方法,它“奏效了”,但速度慢得令人痛苦:

镜头: 44930886镜头出局: 35322469运行时间: 247.6秒

有更快的方法从“非常大”的字符串中删除空格吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-10 18:13:11

我怀疑性能问题是由于创建了大量的大型中间字符串。因此,任何在不创建中间字符串或使用更少字符串的情况下执行任务的方法都会执行得更好。

Regex替换的可能性很大。

代码语言:javascript
复制
Option Explicit

Sub Test(ByVal text As String)

  Static Regex As Object
  If Regex Is Nothing Then
    Set Regex = CreateObject("VBScript.RegExp")
    Regex.Global = True
    Regex.MultiLine = True
  End If

  Regex.Pattern = " +" ' space, one or more times

  Dim result As String: result = Regex.Replace(text, " ")
  Debug.Print Len(result), Left(result, 20)
End Sub

输入字符串为4500万字符,大约需要一秒钟。

跑步者:

代码语言:javascript
复制
Sub Main()

  Const ForReading As Integer = 1
  Const FormatUTF16 As Integer = -1 ' aka TriStateTrue
  Dim fso As Object: Set fso = CreateObject("Scripting.FileSystemObject")
  Dim file As Object: Set file = fso.OpenTextFile("C:\ProgramData\test.txt", ForReading, False, FormatUTF16)
  Dim text As String: text = file.ReadAll()
  Set file = Nothing
  Set fso = Nothing
  Debug.Print Len(text), Left(text, 20)

  Test (text)

End Sub

测试数据创建器(C#):

代码语言:javascript
复制
var substring = "××\n× ××   ";
var text = String.Join("", Enumerable.Repeat(substring, 45_000_000 / substring.Length));
var encoding = new UnicodeEncoding(false, false);
File.WriteAllText(@"C:\ProgramData\test.txt", text, encoding);

从VBA开始(VB4,Java,JavaScript,C#,VB,…)使用UTF-16,空间字符是一个UTF-16代码单元ChrW(32).(与ASCII的任何相似或比较都是不必要的精神体操,如果将其作为ANSI Chr(32)进行编码,则在幕后进行不必要的转换,对于不同的机器、用户和时间具有不同的行为。)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48721399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档