我正在使用VBA中非常大的(45,000,000+字符)字符串,我需要删除多余的白空间。
一个空格(也就是ASCII代码32)是可以的,但是任何有两个或多个连续空格的部分都应该减少到一个。
我发现了一个类似的问题这里,尽管OP对“超长字符串”的定义只有39,000个字符。接受的答案是一个使用Replace的循环。
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秒
有更快的方法从“非常大”的字符串中删除空格吗?
发布于 2018-02-10 18:13:11
我怀疑性能问题是由于创建了大量的大型中间字符串。因此,任何在不创建中间字符串或使用更少字符串的情况下执行任务的方法都会执行得更好。
Regex替换的可能性很大。
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万字符,大约需要一秒钟。
跑步者:
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#):
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)进行编码,则在幕后进行不必要的转换,对于不同的机器、用户和时间具有不同的行为。)
https://stackoverflow.com/questions/48721399
复制相似问题