[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 10# flashercs

另外, 也有可能像下面这样, 标签文本后没有,号, 也不提取出去了, 因为也匹配不到下面内容里的标签文本
┋呼呼先生大姐女士

TOP

本帖最后由 小白龙 于 2022-8-30 11:22 编辑

回复 10# flashercs

大佬, 再给您加15红包, 麻烦给加个判断,
_________________________________________________________________
原来是这样:

┋国家, 中国, 美国, 日本
┋城市, 北京, 上海, 广州
我的名字是 ┃名字┃, 我的国家是 ┃国家┃, 我的年龄是┃年龄┃, 我家住在┃城市┃!

┋称呼, 先生, 大姐, 女士
你好┃称呼┃别来无恙.

┋称呼, 先生, 大姐
你好┃称呼┃, 我的打印机品牌是┃品牌┃.
_________________________________________________________________
现在是这样:

┋国家, 中国, 美国, 日本
┋大理, 三亚, 海南
我的名字是 ┃名字┃, 我的国家是 ┃国家┃, 我的年龄是┃年龄┃, 我家住在┃城市┃!

┋呼呼, 先生, 大姐, 女士
你好┃称呼┃别来无恙.

┋称呼, 先生, 大姐
你好┃称呼┃, 我的打印机品牌是┃品牌┃.
_________________________________________________________________
注意红色字部分, 虽然前面有┋ ,但是后面的文本 在其下方的内容中找不到匹配, 所以该行不再提取出去了, 其它的逻辑不变
简单的说: ┋标签文本, 和 其下方内容里的 ┃标签文本┃ 匹配时才分离出去, 否则就留下

最后的目标结果:
变量$B的值:
┃Y_国家┃ 国家[]中国[]美国[]日本
┃Y_称呼┃ 称呼[]先生[]大姐

变量$C的值:       
┋大理, 三亚, 海南
我的名字是 ┃N_名字┃, 我的国家是 ┃Y_国家┃, 我的年龄是┃N_年龄┃, 我家住在┃N_城市┃!

┋呼呼, 先生, 大姐, 女士
你好┃N_称呼┃别来无恙.

你好┃Y_称呼┃, 我的打印机品牌是┃N_品牌┃.

TOP

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

TOP

回复 8# flashercs


多谢大佬, 第2个┃和后面的文字之间有两个空格了, 应该只有一个
目标:
┃Y_国家┃ 国家[]

现状:
┃Y_国家┃  国家[]

TOP

回复 7# 小白龙


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

TOP

本帖最后由 小白龙 于 2022-8-30 09:18 编辑

回复 5# flashercs


大佬,不好意思, 我在表达标签的格式时,漏了一句, PS代码我现在还看不懂, 麻烦大佬再改一下, 多谢
现在标签变量$B的值如下
┃Y_国家┃ 中国[]美国[]日本
┃Y_城市┃ 北京[]上海[]广州
┃Y_称呼┃ 先生[]大姐[]女士
┃Y_称呼2┃ 先生[]大姐
____________________________改为如下,就是在第2个┃之后的空格后面,加上 标签文本[]
┃Y_国家┃ 国家[]中国[]美国[]日本
┃Y_城市┃ 城市[]北京[]上海[]广州
┃Y_称呼┃ 称呼[]先生[]大姐[]女士
┃Y_称呼2┃ 称呼2[]先生[]大姐

TOP

感谢大佬, 刚看到,
我再试试多行多段能否通过

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

手动操作的难度是要注意标签出现的次数,别的方面相对简单

感觉PS脚本最难的地方在, 内容里的标签修改, 要注意其上方的标签行, 再加上上边手动操作的难度

TOP

回复 2# flashercs


感谢大佬, 标签好像提取没问题了, 但是内容修改好像没有变动,

感谢大佬一直以来的帮助指导, 搞定后, 来杯咖啡

上面的最后的地方描述
__________________________________________________________________________________________________
所有余下的内容, 存到变量$C, 值如下:
注意: 内部的空行要保留

我的名字是 ┃N_名字┃, 我的国家是 ┃Y_国家┃, 我的年龄是┃N_年龄┃, 我家住在┃Y_城市┃!

你好┃Y_称呼┃别来无恙.

你好┃Y_称呼2┃, 我的打印机品牌是┃N_品牌┃.

TOP

  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

返回列表