[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
想用C#或库之类的, 是因为不知为什么, PS5在我的win10下启动好慢, 处理起来好像也比C#慢不少

要是C#我可以编译为一个exe, 速度会快很多

TOP

文档格式算法是你定义的;我也看不懂;
powershell慢;因为加载module 太多;
这种自定义格式没有dll库可用, 你可以改成C#,只是有点麻烦;
微信:flashercs
QQ:49908356

TOP

感谢大佬提醒, 也没有外部module, 就是反应慢, 真是怪了

TOP

本帖最后由 小白龙 于 2022-9-2 08:52 编辑

回复 13# flashercs
原字符串:
┋国家, 中国, 美国, 日本
         ┋城市, 北京, 上海, 广州
        ┋大理, 三亚, 海南
我的名字是 ┃名字┃, 我的国家是 ┃国家┃, 我的年龄是┃年龄┃, 我家住在┃城市┃!
_________________________________________________________________
修改代码后处理结果:
┃Y_国家┃ 国家[]中国[]美国[]日本
┃Y_城市┃ 城市[]北京[]上海[]广州
        ┋大理, 三亚, 海南
我的名字是 ┃N_名字┃, 我的国家是 ┃Y_国家┃, 我的年龄是┃N_年龄┃, 我家住在┃Y_城市┃!
_________________________________________________________________

大佬, 请教两个小问题:
问题1.像上面的原字符串,标签前面带有空格符, 也能处理, PS代码我做了以下修改实现了:
行9
$reLabel = [regex]'┋([^,]*),(\s*)' #标签正则
改为
$reLabel = [regex]'\s*┋([^,]*),(\s*)' #标签正则
__________________
行60和90
$_.StartsWith("┋")
改为
$_.trim().StartsWith("┋")
___________________________________________________________
但是对应的C#代码, 我做了同样的修改, 会报错, 修改如下:
行21
Regex("┋([^,]*),(\\s*)"
改为了
Regex("\\s*┋([^,]*),(\\s*)"
__________________
行74和116
line.StartsWith("┋")
改为了
line.trim().StartsWith("┋")

问题2.处理后的标签┃后面必须要有一个空格, 但如果原字符串标签文本后的第一个逗号后面没有空格, 就不灵了, 例如下面:
┋国家,中国, 美国, 日本

TOP

本帖最后由 flashercs 于 2022-9-3 13:21 编辑

.Trim() 必须大小写正确;
$reLabel = [regex]'\s*┋([^,]*),(\s*)' #标签正则
  1. # 替换label
  2. $sbLabel = {
  3.   param([System.Text.RegularExpressions.Match]$m)
  4.   $k = $m.Groups[1].Value
  5.   if ($dicLabelCtr.ContainsKey($k)) {
  6.     $ctr = (++$dicLabelCtr[$k])
  7.     "┃Y_$k$ctr┃ $k$ctr[]"
  8.   } else {
  9.     $dicLabelCtr[$k] = 1
  10.     "┃Y_$k┃ $k[]"
  11.   }
  12. }
复制代码
  1. //# 替换label
  2.             MatchEvaluator sbLabel = delegate (Match m)
  3.             {
  4.                 string k = m.Groups[1].Value;
  5.                 if (dicLabelCtr.ContainsKey(k))
  6.                 {
  7.                     int ctr = ++dicLabelCtr[k];
  8.                     return string.Format("┃Y_{0}{1}┃{2}{0}{1}[]", k, ctr, " ");
  9.                 }
  10.                 else
  11.                 {
  12.                     dicLabelCtr[k] = 1;
  13.                     return string.Format("┃Y_{0}┃{1}{0}[]", k, " ");
  14.                 }
  15.             };
复制代码
1

评分人数

微信:flashercs
QQ:49908356

TOP

回复 20# flashercs

多谢大佬!

TOP

回复 20# flashercs

大佬再请教一下,
标签前的符号, 前面的例子都是┋, 刚发现有时还可能会是┇  还没有发现同时存在的情况,
我改了下面地方,想实现可以适用这两种符号, 结果标签输出为空:

$reLabel = [regex]'\s(┋|┇)([^,]*),(\s*)' #标签正则



if ($_.trim().StartsWith("┋") -or $_.trim().StartsWith("┇")) {
___________________________________________________________________
  1. $A = @'
  2. ┇城市, 北京, 上海, 广州
  3. ┇大理, 三亚, 海南
  4. 我的名字是 ┃名字┃, 我的国家是 ┃国家┃, 我的年龄是┃年龄┃, 我家住在┃城市┃!
  5. '@
  6. [Collections.ArrayList]$B = @() #存标签
  7. [Collections.ArrayList]$C = @() #存内容
  8. [Collections.ArrayList]$CLocal = @() #存内容Local
  9. [Collections.ArrayList]$keysInContent = @() #keys in content
  10. $dicLabelCtr = @{} #标签个数统计
  11. # $dicLabelLocal = @{} #标签个数统计: {称呼 =称呼2}
  12. $dicLabelLocal4B = [ordered]@{} #{标签 = Line}
  13. #$reLabel = [regex]'┋([^,]*),(\s*)' #标签正则
  14. $reLabel = [regex]'\s(┋|┇)([^,]*),(\s*)' #标签正则
  15. $reContent = [regex]'┃([^┃]*)┃' #内容正则
  16. # 替换label
  17. $sbLabel = {
  18. param ([System.Text.RegularExpressions.Match]$m)
  19. $k = $m.Groups[1].Value
  20. if ($dicLabelCtr.ContainsKey($k))
  21. {
  22. $ctr = (++$dicLabelCtr[$k])
  23. "┃Y_$k$ctr┃ $k$ctr[]"
  24. }
  25. else
  26. {
  27. $dicLabelCtr[$k] = 1
  28. "┃Y_$k┃ $k[]"
  29. }
  30. }
  31. # 替换内容
  32. $sbContent = {
  33.   param([System.Text.RegularExpressions.Match]$m)
  34.   $k = $m.Groups[1].Value
  35.   if ($dicLabelLocal4B.Contains($k)) {
  36.     [void]$keysInContent.Add($k)
  37.     if ($dicLabelCtr.ContainsKey($k)) {
  38.       "┃Y_${k}$($dicLabelCtr[$k]+1)┃"
  39.     } else {
  40.       "┃Y_${k}┃"
  41.     }
  42.   } else {
  43.     "┃N_$k┃"
  44.   }
  45. }
  46. $stack = 0 #content
  47. $A -split '\r\n' | ForEach-Object {
  48.   if ($stack -eq 0) {
  49.     if ($_.trim().StartsWith("┋") -or $_.trim().StartsWith("┇")) {
  50.       $stack = 1
  51.       # procossing prev section
  52.       for ($i = 0; $i -lt $CLocal.Count; $i++) {
  53.         $CLocal[$i] = $reContent.Replace($CLocal[$i], $sbContent)
  54.       }
  55.       foreach ($key in @($dicLabelLocal4B.Keys)) {
  56.         if (-not $keysInContent.Contains($key)) {
  57.           [void]$C.Add($dicLabelLocal4B[$key])
  58.           $dicLabelLocal4B.Remove($key)
  59.         } else {
  60.           [void]$B.Add(($reLabel.Replace($dicLabelLocal4B[$key], $sbLabel) -replace ',\s*', '[]'))
  61.         }
  62.       }
  63.       [void]$C.AddRange($CLocal)
  64.       $CLocal.Clear()
  65.       $keysInContent.Clear()
  66.       $dicLabelLocal4B.Clear()
  67.       # next section
  68.       $m = $reLabel.Match($_)
  69.       if ($m.Success) {
  70.         $dicLabelLocal4B[$m.Groups[1].Value] = $_
  71.       } else {
  72.         $dicLabelLocal4B[$_] = $_
  73.       }
  74.     } else {
  75.       [void]$CLocal.Add($_)
  76.     }
  77.   } else {
  78.     # stack=1
  79.     if ($_.trim().StartsWith("┋") -or $_.trim().StartsWith("┇")) {
  80.       $m = $reLabel.Match($_)
  81.       if ($m.Success) {
  82.         $dicLabelLocal4B[$m.Groups[1].Value] = $_
  83.       } else {
  84.         $dicLabelLocal4B[$_] = $_
  85.       }
  86.     } else {
  87.       $stack = 0
  88.       [void]$CLocal.Add($_)
  89.     }
  90.   }
  91. }
  92. # procossing prev section
  93. for ($i = 0; $i -lt $CLocal.Count; $i++) {
  94.   $CLocal[$i] = $reContent.Replace($CLocal[$i], $sbContent)
  95. }
  96. foreach ($key in @($dicLabelLocal4B.Keys)) {
  97.   if (-not $keysInContent.Contains($key)) {
  98.     [void]$C.Add($dicLabelLocal4B[$key])
  99.     $dicLabelLocal4B.Remove($key)
  100.   } else {
  101.     [void]$B.Add(($reLabel.Replace($dicLabelLocal4B[$key], $sbLabel) -replace ',\s*', '[]'))
  102.   }
  103. }
  104. [void]$C.AddRange($CLocal)
  105. $CLocal.Clear()
  106. $keysInContent.Clear()
  107. $dicLabelLocal4B.Clear()
  108. $B
  109. '---'
  110. $C
复制代码

TOP

回复 22# 小白龙
  1. $reLabel = [regex]'\s*(?:┋|┇)([^,]*),(\s*)' #标签正则
复制代码
微信:flashercs
QQ:49908356

TOP

回复 23# flashercs


多谢

TOP

化简为繁!!!

powershell 吸取了 C#的对象方法和purl语言的文本高效处理方式,要想PS高效,文本处理尽量不要对象化。

给你支一招:把文本按需要的段落分割(不是逐行处理)。你这样的文本处理,十几万行也瞬间完成。 正则可以不单独入组的尽量不要入组,减少开销。能用贪婪的尽量贪婪。反正想办法减少回朔处理。
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

回复 25# xczxczxcz

感谢支招, 在下不才, 前面大佬写的PS和C#都还没有看懂
要是能分享一下代码就好了, 看看能不能懂,
感觉稳定是第一位的, 我前说的慢, 是因为我的系统PS启动慢, 处理速度还行

TOP

返回列表