0

PowerShell 7.1 我有一个 1GB 文本 UTF8 文本文件,我将其读入单个字符串。我一直在寻找一种有效的方法来查找值大于 127 的所有字符,然后在其前面插入 2 个字符作为标记。例如,字符串中嵌入了 Unicode 十进制 12288。我需要 char 代码 128 然后另一个 char 保存序列中的字符数(或十六进制,如果你认为十六进制更好)。

如果尝试使用 FOR 循环 ($i=0; $i -lt $text.length; $i++) 然后检查 [int]$text[$i] 以找到下一个大于 127 的字符。然后我使用 $left+[char]128+$nonAsciirunlen+$right 插入我的标记

如果 $text 是 [char]12288+' A '+[char]12288+[char]12288 那么它将更改为 [int] 值 128,1, 12288, 32, 65, 32, 128, 2, 12288, 12288

问题是它在一夜之间运行,并且只处理了大约前 350,000 个。我需要它在大约 10 分钟内处理,但一个小时是可以接受的。

我的目标是用 128 的标记和序列长度来标记字符序列。速度问题似乎是每次我附加字符串的左侧,两个标记代码,然后是字符串的右侧,一切都会变慢。我猜可能是每次我将字符串连接在一起时,PowerShell 都不会释放内存,但这只是一个疯狂的猜测。我没有看内存使用情况。我有 24GB 的内存。

我尝试使用 -encoding UTF8 和 Format-Hex 将字符串转换为十六进制,但即使是 10MB 的部分也会导致来自 Format-Hex 的内存数组异常。这是在字节级别上工作的,但概念相同,只是要跳过的多个字节序列的数量将比跳过实际的字符数更大。

任何想法将不胜感激。

这是我能够处理它的最快速度。这将允许另一个应用程序处理修改后的 UTF8 文本文件,而不会在多字节字符上崩溃。


$t = [char]12288 + 'A' + [char]12288 + [char]12288 + [char]12288 + ' BC'
$m = [char]128
$len = 0
$stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
for ($i = 0; $i -lt $t.length; $i++) {
    if (([int]$t[$i]) -lt 128) { continue; }
    $oi = $i

    while (([int]$t[$i]) -gt 127) { $i++; $len++ }
    $l = $t.Substring(0, $oi)
    $r = $t.Substring($oi)
    $t = $l + $m + [char]$len + $r
    $i = $i + 2 
    $len = 0
} #next $i
write-host $stopwatch.Elapsed.TotalSeconds
#Display results
clear
for ($i = 0; $i -lt $t.Length; $i++) {
     $d = [int]$t[$i];
      write-host $d ',' -NoNewline 
    }; write-host
4

0 回答 0