[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
  1. [Collections.ArrayList]$B = @() #存标签
  2. [Collections.ArrayList]$C = @() #存内容
  3. $Script:dic=@{}
  4. $re=[regex]'┋(.*?),'
  5. $A = @'
  6. ┋国家, 中国, 美国, 日本
  7. ┋城市, 北京, 上海, 广州
  8. 我的名字是 ┃名字┃, 我的国家是 ┃国家┃, 我的年龄是┃年龄┃, 我家住在┃城市┃!
  9. ┋称呼, 先生, 大姐, 女士
  10. 你好┃称呼┃别来无恙.
  11. ┋称呼, 先生, 大姐
  12. 你好┃称呼┃, 我的打印机品牌是┃品牌┃.
  13. '@
  14. #将变量$a的内容进行处理:
  15. #┋开头的标签行:分离、处理后保存到变量$B
  16. #余下的内容:处理后保存到变量$C
  17. $A -split '\r\n' |
  18. %{
  19. if ($_.StartsWith("┋"))
  20. {
  21. [void]$B.Add(($re.Replace($_,{param($m)$k=$m.Groups[1].Value;if($Script:dic.ContainsKey($k)){"┃Y_$k$((++$Script:dic[$k]))┃"}else{$Script:dic[$k]=1;"┃Y_$k┃"}}) -replace ',\s*','[]'))
  22. }
  23. else
  24. {
  25. [void]$C.Add($_)
  26. }
  27. }
  28. $B
  29. #$B -replace '┋(.*?),', '┃Y_${1}┃' -replace ',', '[]'
  30. $C
复制代码
微信:flashercs
QQ:49908356

TOP

本帖最后由 flashercs 于 2022-8-30 10:55 编辑
  1. [Collections.ArrayList]$B = @() #存标签
  2. [Collections.ArrayList]$C = @() #存内容
  3. $dicLabel = @{} #标签个数统计
  4. $dicLabelLocal = @{} #标签个数统计Local
  5. $reLabel = [regex]'┋([^,]*),(\s*)' #标签正则
  6. $reContent = [regex]'┃([^┃]*)┃' #内容正则
  7. # 替换label
  8. $sbLabel = {
  9.   param([System.Text.RegularExpressions.Match]$m)
  10.   $k = $m.Groups[1].Value
  11.   if ($dicLabel.ContainsKey($k)) {
  12.     $ctr = (++$dicLabel[$k])
  13.     $dicLabelLocal[$k] = "$k$ctr"
  14.     "┃Y_$k$ctr┃$($m.Groups[2].Value)$k$ctr[]"
  15.   } else {
  16.     $dicLabel[$k] = 1
  17.     $dicLabelLocal[$k] = "$k"
  18.     "┃Y_$k┃ $($m.Groups[2].Value)$k[]"
  19.   }
  20. }
  21. # 替换内容
  22. $sbContent = {
  23.   param([System.Text.RegularExpressions.Match]$m)
  24.   $k = $m.Groups[1].Value
  25.   if ($dicLabelLocal.Contains($k)) {
  26.     "┃Y_$($dicLabelLocal[$k])┃"
  27.   } else {
  28.     "┃N_$k┃"
  29.   }
  30. }
  31. $A = @'
  32. ┋国家, 中国, 美国, 日本
  33. ┋城市, 北京, 上海, 广州
  34. 我的名字是 ┃名字┃, 我的国家是 ┃国家┃, 我的年龄是┃年龄┃, 我家住在┃城市┃!
  35. ┋称呼, 先生, 大姐, 女士
  36. 你好┃称呼┃别来无恙.
  37. ┋称呼, 先生, 大姐
  38. 你好┃称呼┃, 我的打印机品牌是┃品牌┃.
  39. '@
  40. #将变量$a的内容进行处理:
  41. #┋开头的标签行:分离、处理后保存到变量$B
  42. #余下的内容:处理后保存到变量$C
  43. $stack = 0 #content
  44. $A -split '\r\n' | ForEach-Object {
  45.   if ($stack -eq 0) {
  46.     if ($_.StartsWith("┋")) {
  47.       $stack = 1
  48.       $dicLabelLocal.Clear()
  49.       [void]$B.Add(($reLabel.Replace($_, $sbLabel) -replace ',\s*', '[]'))
  50.     } else {
  51.       [void]$C.Add($reContent.Replace($_, $sbContent))
  52.     }
  53.   } else {
  54.     if ($_.StartsWith("┋")) {
  55.       [void]$B.Add(($reLabel.Replace($_, $sbLabel) -replace ',\s*', '[]'))
  56.     } else {
  57.       $stack = 0
  58.       [void]$C.Add($reContent.Replace($_, $sbContent))
  59.     }
  60.   }
  61. }
  62. $B
  63. $C
复制代码
微信:flashercs
QQ:49908356

TOP

回复 7# 小白龙


    上面修改了一下.
微信:flashercs
QQ:49908356

TOP

第15行 空格
微信:flashercs
QQ:49908356

TOP

本帖最后由 flashercs 于 2022-8-30 15:52 编辑

回复 12# 小白龙
标签/内容 相互检测是太复杂
  1. [Collections.ArrayList]$B = @() #存标签
  2. [Collections.ArrayList]$C = @() #存内容
  3. [Collections.ArrayList]$CLocal = @() #存内容Local
  4. [Collections.ArrayList]$keysInContent = @() #keys in content
  5. $dicLabelCtr = @{} #标签个数统计
  6. # $dicLabelLocal = @{} #标签个数统计: {称呼 =称呼2}
  7. $dicLabelLocal4B = [ordered]@{} #{标签 = Line}
  8. $reLabel = [regex]'┋([^,]*),(\s*)' #标签正则
  9. $reContent = [regex]'┃([^┃]*)┃' #内容正则
  10. # 替换label
  11. $sbLabel = {
  12.   param([System.Text.RegularExpressions.Match]$m)
  13.   $k = $m.Groups[1].Value
  14.   if ($dicLabelCtr.ContainsKey($k)) {
  15.     $ctr = (++$dicLabelCtr[$k])
  16.     # $dicLabelLocal[$k] = "$k$ctr"
  17.     "┃Y_$k$ctr┃$($m.Groups[2].Value)$k$ctr[]"
  18.   } else {
  19.     $dicLabelCtr[$k] = 1
  20.     # $dicLabelLocal[$k] = "$k"
  21.     "┃Y_$k┃$($m.Groups[2].Value)$k[]"
  22.   }
  23. }
  24. # 替换内容
  25. $sbContent = {
  26.   param([System.Text.RegularExpressions.Match]$m)
  27.   $k = $m.Groups[1].Value
  28.   if ($dicLabelLocal4B.Contains($k)) {
  29.     [void]$keysInContent.Add($k)
  30.     if ($dicLabelCtr.ContainsKey($k)) {
  31.       "┃Y_${k}$($dicLabelCtr[$k]+1)┃"
  32.     } else {
  33.       "┃Y_${k}┃"
  34.     }
  35.   } else {
  36.     "┃N_$k┃"
  37.   }
  38. }
  39. $A = @'
  40. ┋国家, 中国, 美国, 日本
  41. ┋城市, 北京, 上海, 广州
  42. ┋大理, 三亚, 海南
  43. 我的名字是 ┃名字┃, 我的国家是 ┃国家┃, 我的年龄是┃年龄┃, 我家住在┃城市┃!
  44. ┋称呼, 先生, 大姐, 女士
  45. ┋呼呼, 先生, 大姐, 女士
  46. 你好┃称呼┃别来无恙.
  47. ┋称呼, 先生, 大姐
  48. 你好┃称呼┃, 我的打印机品牌是┃品牌┃.
  49. '@
  50. #将变量$a的内容进行处理:
  51. #┋开头的标签行:分离、处理后保存到变量$B
  52. #余下的内容:处理后保存到变量$C
  53. $stack = 0 #content
  54. $A -split '\r\n' | ForEach-Object {
  55.   if ($stack -eq 0) {
  56.     if ($_.StartsWith("┋")) {
  57.       $stack = 1
  58.       # procossing prev section
  59.       for ($i = 0; $i -lt $CLocal.Count; $i++) {
  60.         $CLocal[$i] = $reContent.Replace($CLocal[$i], $sbContent)
  61.       }
  62.       foreach ($key in @($dicLabelLocal4B.Keys)) {
  63.         if (-not $keysInContent.Contains($key)) {
  64.           [void]$C.Add($dicLabelLocal4B[$key])
  65.           $dicLabelLocal4B.Remove($key)
  66.         } else {
  67.           [void]$B.Add(($reLabel.Replace($dicLabelLocal4B[$key], $sbLabel) -replace ',\s*', '[]'))
  68.         }
  69.       }
  70.       [void]$C.AddRange($CLocal)
  71.       $CLocal.Clear()
  72.       $keysInContent.Clear()
  73.       $dicLabelLocal4B.Clear()
  74.       # next section
  75.       $m = $reLabel.Match($_)
  76.       if ($m.Success) {
  77.         $dicLabelLocal4B[$m.Groups[1].Value] = $_
  78.       } else {
  79.         $dicLabelLocal4B[$_] = $_
  80.       }
  81.     } else {
  82.       [void]$CLocal.Add($_)
  83.     }
  84.   } else {
  85.     # stack=1
  86.     if ($_.StartsWith("┋")) {
  87.       $m = $reLabel.Match($_)
  88.       if ($m.Success) {
  89.         $dicLabelLocal4B[$m.Groups[1].Value] = $_
  90.       } else {
  91.         $dicLabelLocal4B[$_] = $_
  92.       }
  93.     } else {
  94.       $stack = 0
  95.       [void]$CLocal.Add($_)
  96.     }
  97.   }
  98. }
  99. # procossing prev section
  100. for ($i = 0; $i -lt $CLocal.Count; $i++) {
  101.   $CLocal[$i] = $reContent.Replace($CLocal[$i], $sbContent)
  102. }
  103. foreach ($key in @($dicLabelLocal4B.Keys)) {
  104.   if (-not $keysInContent.Contains($key)) {
  105.     [void]$C.Add($dicLabelLocal4B[$key])
  106.     $dicLabelLocal4B.Remove($key)
  107.   } else {
  108.     [void]$B.Add(($reLabel.Replace($dicLabelLocal4B[$key], $sbLabel) -replace ',\s*', '[]'))
  109.   }
  110. }
  111. [void]$C.AddRange($CLocal)
  112. $CLocal.Clear()
  113. $keysInContent.Clear()
  114. $dicLabelLocal4B.Clear()
  115. $B
  116. $C
复制代码
微信:flashercs
QQ:49908356

TOP

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

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

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

TOP

返回列表