Board logo

标题: [问题求助] PowerShell用A-Z的序号并以一定的格式来整理键值对 [打印本页]

作者: 小白龙    时间: 2022-11-13 19:29     标题: PowerShell用A-Z的序号并以一定的格式来整理键值对

本帖最后由 小白龙 于 2022-11-15 10:21 编辑

每对键和值之间用 --- 分隔
键和值之间用一个空行分隔,键的内容是单行,值的内容是N行
我想把这些键值对, 用A-Z的序号整理一下, 如下图所示: 左侧是源键值对儿字符串, 右侧是整理后的效果
黑色字是固定不变的, 红色字是根据键值对儿的数量而变动的地方! 从A Av 开始, 到Z  Zv结束, 根据值键对的数量来决定
注意整理后: 键内容左边有1空格, 值内容每段的左边也有1空格
  1. $s= @'
  2. Key 1
  3. Hello 1
  4. World 1
  5. ---
  6. Key 2
  7. Hello 2
  8. World 2
  9. ---
  10. Key 3
  11. Hello 3
  12. World 3
  13. '@
  14. #PS代码
  15. <# 执行后结果如下:
  16. sss A=
  17. Key 1
  18. sss Av=
  19. Hello 1
  20. World 1
  21. Av.fff
  22. sss B=
  23. Key 2
  24. sss Bv=
  25. Hello 2
  26. World 2
  27. Bv.fff
  28. sss C=
  29. Key 3
  30. sss Cv=
  31. Hello 3
  32. World 3
  33. Cv.fff
  34. sss kv=
  35. @
  36. {A}={Av}
  37. {B}={Bv}
  38. {C}={Cv}
  39. DDD(kv)
  40. #>
复制代码

作者: 小白龙    时间: 2022-11-13 19:40

回复 1# 小白龙


下面代码可以循环输出A到Z的大写字母
  1. 97 .. 122 | %{ $s = [char]$_; $s.ToString().ToUpper() }
复制代码

作者: idwma    时间: 2022-11-13 23:54

  1. $a=65
  2. $s.split('---')|?{$_ -ne ''}|%{
  3. $b=$_.trim() -split '\n'
  4. $c=[char](++$a-1)
  5. '{0} {1} {2}' -f "sss","$c=`n",$i[0]
  6. "sss ${k}v="
  7. $b[1..$b.length]|%{" $_"}
  8. "${c}v.fff`n"
  9. }
复制代码

作者: idwma    时间: 2022-11-14 15:13

  1. $a = 65
  2. $s.split('---') | ?{ $_ -ne '' } | %{
  3. $b = $_.trim() -split '\n'|?{$_ -ne ''}
  4. $c = [char](++$a - 1)
  5. '{0} {1} {2}' -f "sss", "$c=`n", $b[0]
  6. "sss ${c}v="
  7. $b[1 .. $b.length] | %{ " $_" }
  8. "${c}v.fff`n"
  9. }
复制代码

作者: idwma    时间: 2022-11-14 16:39

是这样吗

作者: idwma    时间: 2022-11-14 18:43

本帖最后由 idwma 于 2022-11-14 18:46 编辑

回复 8# 小白龙
  1. $a = 65
  2. $s.split('---') | ?{ $_ -ne '' } | %{
  3. $b = $_.trim() -split '\n'
  4. $c = [char](++$a - 1)
  5. '{0} {1} {2}' -f "sss", "$c=`n", $b[0]
  6. "sss ${c}v="
  7. $b[2 .. $b.length] | %{ " $_" }
  8. "${c}v.fff`n"
  9. }
  10. 'sss kv='
  11. '@'
  12. 65..($a-1)|%{' {{{0}}}={{{0}v}}' -f [char]$_}
  13. 'DDD(kv)'
复制代码

作者: idwma    时间: 2022-11-14 19:28

本帖最后由 idwma 于 2022-11-14 19:31 编辑

回复 10# 小白龙


    有空格也有空行呀

作者: idwma    时间: 2022-11-14 20:27

不会了   
.
作者: 小白龙    时间: 2022-11-14 20:36

回复 14# idwma


    我加了个&{} 输出的结果 貌似可以了, 但是有多余的空行
  1. &{
  2. $a = 65
  3. $s.split('---') | ?{ $_ -ne '' } | %{
  4. $b = $_.trim() -split '\n'
  5. $c = [char](++$a - 1)
  6. '{0} {1} {2}' -f "sss", "$c=`n", $b[0]
  7. "sss ${c}v="
  8. $b[2 .. $b.length] | %{ " $_" }
  9. "${c}v.fff`n"
  10. }
  11. 'sss kv='
  12. '@'
  13. 65 .. ($a - 1) | %{ ' {{{0}}}={{{0}v}}' -f [char]$_ }
  14. 'DDD(kv)'
  15. } > a.txt
复制代码

作者: 小白龙    时间: 2022-11-15 10:21

回复 14# idwma

多谢大佬, 上面你的代码是OK的, 是我用的软件的问题
作者: 小白龙    时间: 2022-11-21 08:59

本帖最后由 小白龙 于 2022-11-21 09:12 编辑

回复 6# idwma

大佬, 我把您的代码改了一下, 遇到一个问题:

最后那三行代码, 我想输出下面的效果,即: 每对儿之间加个[]连成一行
sss kv=@"{A}={Av}[]{B}={Bv}[]{C}={Cv}"

但不知为什么却输出成了下面, 即: []后面会有个空格, 怎么把空格删掉?
sss kv=@"{A}={Av}[] {B}={Bv}[] {C}={Cv}"

另外,21行开始的地方, 为了防止切片后有空行, 我使用了"\r\n---\r\n"
但总感觉代码还可以再改进一下
  1. cls
  2. $s = @'
  3. A Key
  4. -
  5. Hello 1
  6. World 1
  7. ---
  8. B Key
  9. -
  10. Hello 2
  11. World 2
  12. ---
  13. C Key
  14. -
  15. Hello 3
  16. World 3
  17. '@
  18. $ci = 65
  19. $s -split "\r\n---\r\n" | %{
  20. $b = $_ -split "\r\n-\r\n"
  21. $c = [char]$ci
  22. "sss $c=`r`n $($b[0])"
  23. "sss ${c}v="
  24. $b[1] -split "\r\n" | %{ " $_" }
  25. "${c}v.ffff`r`n"
  26. $ci++
  27. }
  28. $ar=@()
  29. 65 .. ($ci - 1) | %{ $ar += "{$([char]$_)}={$([char]$_)v}[]" }
  30. 'sss kv=@' + '"{0}"' -f "$ar".TrimEnd("[]")
  31. 'DDD(kv)'
复制代码

作者: 小白龙    时间: 2022-11-22 13:20

回复 6# idwma


   直接加引号好像不行, 只能用这个了

-join $ar
作者: idwma    时间: 2022-11-22 17:57

本帖最后由 idwma 于 2022-11-22 18:04 编辑
  1. $ofs=''
  2. 'sss kv=@' + '"{0}"' -f "$ar".TrimEnd("[]")
复制代码
加个出处
https://devblogs.microsoft.com/powershell/psmdtagfaq-what-is-ofs/
作者: 小白龙    时间: 2022-11-22 18:18

回复 13# idwma

多谢大佬
作者: 小白龙    时间: 2022-11-22 18:21

回复 13# idwma


   大佬, 能帮看一下这个吗? 想用纯正则把---隔开的那三部分存到数组, 总感觉可以实现
http://www.bathome.net/thread-64431-1-1.html
作者: idwma    时间: 2022-11-22 19:04

回复 15# 小白龙


   你一楼的不是已经实现了吗
作者: 小白龙    时间: 2022-11-22 20:03

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

回复 16# idwma


一楼不是用的正则, 用的split实现的, 二楼用的开关,

我想用纯正则实现相同的功能, 正则比较通用, 我用的那个软件没有 split 功能, 只有正则, 查找和替换功能
作者: idwma    时间: 2022-11-22 20:44

回复 17# 小白龙


    不会呀
作者: terse    时间: 2022-11-24 16:47

来练练手
  1. $s= @'
  2. Key 1
  3. Hello 1
  4. World 1
  5. ---
  6. Key 2
  7. Hello 2
  8. World 2
  9. ---
  10. Key 3
  11. Hello 3
  12. World 3
  13. '@
  14. $pattern = "(([\S\s]+?)[\r\n]+---[`r`n]?)"
  15. $out = ( $s + "`r`n---" | Select-String -Pattern "(([\S\s]+?)[\r\n]+---[\r\n]?)" -AllMatches ).Matches.Value -replace "---" ,''
  16. $ss = 'sss '
  17. $arr=@()
  18. $n = 65
  19. $out |% {
  20.     $a,$b = ($_ -replace '[\r\n]+', "`n" |Select-String -Pattern "(.+?)\n"  -AllMatches).Matches.Value
  21.     $c = [char](++$n - 1)
  22.     $arr += "{$c}={$($c)v}[]"
  23.     "$ss $c="
  24.     ' ' + $a.trim()
  25.     ' ' + $($b -join " ").trim()
  26.     "sss ${c}v="
  27.     ' ' + "${c}v.ffff"
  28. }
  29. 'sss kv=@' + '"{0}"' -f ($arr -join '').TrimEnd("[]")
  30. 'DDD(kv)'
复制代码

作者: 小白龙    时间: 2022-11-24 17:26

回复 19# terse

多谢大佬, 结果有点问题, 另外, 每对之间有个空行
另外键值B的结果应该是这样
  1. sss B=
  2. Key 2
  3. sss Bv=
  4. Hello 2
  5. World 2
  6. Bv.fff
复制代码

作者: terse    时间: 2022-11-24 18:42

本帖最后由 terse 于 2022-11-24 18:46 编辑

回复 20# 小白龙
30行和29行对调一下呢?另外要空行的话 去掉trim()试一下
  1. $s= @'
  2. Key 1
  3. Hello 1
  4. World 1
  5. ---
  6. Key 2
  7. Hello 2
  8. World 2
  9. ---
  10. Key 3
  11. Hello 3
  12. World 3
  13. '@
  14. $pattern = "(([\S\s]+?)[\r\n]+---[`r`n]?)"
  15. $out = ( $s + "`r`n---" | Select-String -Pattern "(([\S\s]+?)[\r\n]+---[\r\n]?)" -AllMatches ).Matches.Value -replace "---" ,''
  16. $ss = 'sss '
  17. $arr=@()
  18. $n = 65
  19. $out |% {
  20.     $a,$b = ($_  |Select-String -Pattern "(.+?)\n"  -AllMatches).Matches.Value
  21.     $c = [char](++$n - 1)
  22.     $arr += "{$c}={$($c)v}[]"
  23.     "$ss $c="
  24.     ' ' + $a.trim()
  25.     "sss ${c}v="
  26.     ' ' + $($b -join " ").trim()
  27.     ' ' + "${c}v.ffff"
  28. }
  29. 'sss kv=@' + '"{0}"' -f ($arr -join '').TrimEnd("[]")
  30. 'DDD(kv)'
复制代码

作者: 小白龙    时间: 2022-11-24 18:50

回复 21# terse


   空行还是没有
作者: terse    时间: 2022-11-24 20:18

本帖最后由 terse 于 2022-11-24 20:19 编辑

32行这样试
输出没问题的话  你再自己调整一下
  1. ' ' + "${c}v.ffff"+  "`n"
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2