标题: [问题求助] 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空格
- $s= @'
- Key 1
-
- Hello 1
- World 1
- ---
- Key 2
-
- Hello 2
-
- World 2
- ---
- Key 3
-
- Hello 3
- World 3
- '@
-
- #PS代码
-
-
- <# 执行后结果如下:
-
- sss A=
- Key 1
- sss Av=
- Hello 1
- World 1
- Av.fff
-
- sss B=
- Key 2
- sss Bv=
- Hello 2
-
- World 2
- Bv.fff
-
- sss C=
- Key 3
- sss Cv=
- Hello 3
- World 3
- Cv.fff
-
- sss kv=
- @
- {A}={Av}
- {B}={Bv}
- {C}={Cv}
- DDD(kv)
-
- #>
复制代码
作者: 小白龙 时间: 2022-11-13 19:40
回复 1# 小白龙
下面代码可以循环输出A到Z的大写字母- 97 .. 122 | %{ $s = [char]$_; $s.ToString().ToUpper() }
复制代码
作者: idwma 时间: 2022-11-13 23:54
- $a=65
- $s.split('---')|?{$_ -ne ''}|%{
- $b=$_.trim() -split '\n'
- $c=[char](++$a-1)
- '{0} {1} {2}' -f "sss","$c=`n",$i[0]
- "sss ${k}v="
- $b[1..$b.length]|%{" $_"}
- "${c}v.fff`n"
- }
复制代码
作者: idwma 时间: 2022-11-14 15:13
- $a = 65
- $s.split('---') | ?{ $_ -ne '' } | %{
- $b = $_.trim() -split '\n'|?{$_ -ne ''}
- $c = [char](++$a - 1)
- '{0} {1} {2}' -f "sss", "$c=`n", $b[0]
- "sss ${c}v="
- $b[1 .. $b.length] | %{ " $_" }
- "${c}v.fff`n"
- }
复制代码
作者: idwma 时间: 2022-11-14 16:39
是这样吗
作者: idwma 时间: 2022-11-14 18:43
本帖最后由 idwma 于 2022-11-14 18:46 编辑
回复 8# 小白龙 - $a = 65
- $s.split('---') | ?{ $_ -ne '' } | %{
- $b = $_.trim() -split '\n'
- $c = [char](++$a - 1)
- '{0} {1} {2}' -f "sss", "$c=`n", $b[0]
- "sss ${c}v="
- $b[2 .. $b.length] | %{ " $_" }
- "${c}v.fff`n"
- }
- 'sss kv='
- '@'
- 65..($a-1)|%{' {{{0}}}={{{0}v}}' -f [char]$_}
- '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
我加了个&{} 输出的结果 貌似可以了, 但是有多余的空行- &{
- $a = 65
- $s.split('---') | ?{ $_ -ne '' } | %{
- $b = $_.trim() -split '\n'
- $c = [char](++$a - 1)
- '{0} {1} {2}' -f "sss", "$c=`n", $b[0]
- "sss ${c}v="
- $b[2 .. $b.length] | %{ " $_" }
- "${c}v.fff`n"
- }
- 'sss kv='
- '@'
- 65 .. ($a - 1) | %{ ' {{{0}}}={{{0}v}}' -f [char]$_ }
- 'DDD(kv)'
- } > 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"
但总感觉代码还可以再改进一下- cls
- $s = @'
- A Key
- -
- Hello 1
- World 1
- ---
- B Key
- -
- Hello 2
-
- World 2
- ---
- C Key
- -
- Hello 3
- World 3
- '@
-
- $ci = 65
- $s -split "\r\n---\r\n" | %{
- $b = $_ -split "\r\n-\r\n"
- $c = [char]$ci
- "sss $c=`r`n $($b[0])"
- "sss ${c}v="
- $b[1] -split "\r\n" | %{ " $_" }
- "${c}v.ffff`r`n"
- $ci++
- }
- $ar=@()
- 65 .. ($ci - 1) | %{ $ar += "{$([char]$_)}={$([char]$_)v}[]" }
- 'sss kv=@' + '"{0}"' -f "$ar".TrimEnd("[]")
- 'DDD(kv)'
复制代码
作者: 小白龙 时间: 2022-11-22 13:20
回复 6# idwma
直接加引号好像不行, 只能用这个了
-join $ar
作者: idwma 时间: 2022-11-22 17:57
本帖最后由 idwma 于 2022-11-22 18:04 编辑
- $ofs=''
- '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
来练练手- $s= @'
- Key 1
-
- Hello 1
- World 1
- ---
- Key 2
-
- Hello 2
-
- World 2
- ---
- Key 3
-
- Hello 3
- World 3
-
- '@
- $pattern = "(([\S\s]+?)[\r\n]+---[`r`n]?)"
- $out = ( $s + "`r`n---" | Select-String -Pattern "(([\S\s]+?)[\r\n]+---[\r\n]?)" -AllMatches ).Matches.Value -replace "---" ,''
- $ss = 'sss '
- $arr=@()
- $n = 65
- $out |% {
- $a,$b = ($_ -replace '[\r\n]+', "`n" |Select-String -Pattern "(.+?)\n" -AllMatches).Matches.Value
- $c = [char](++$n - 1)
- $arr += "{$c}={$($c)v}[]"
- "$ss $c="
- ' ' + $a.trim()
- ' ' + $($b -join " ").trim()
- "sss ${c}v="
- ' ' + "${c}v.ffff"
- }
- 'sss kv=@' + '"{0}"' -f ($arr -join '').TrimEnd("[]")
- 'DDD(kv)'
复制代码
作者: 小白龙 时间: 2022-11-24 17:26
回复 19# terse
多谢大佬, 结果有点问题, 另外, 每对之间有个空行
另外键值B的结果应该是这样- sss B=
- Key 2
- sss Bv=
- Hello 2
-
- World 2
- Bv.fff
复制代码
作者: terse 时间: 2022-11-24 18:42
本帖最后由 terse 于 2022-11-24 18:46 编辑
回复 20# 小白龙
30行和29行对调一下呢?另外要空行的话 去掉trim()试一下- $s= @'
- Key 1
-
- Hello 1
- World 1
- ---
- Key 2
-
- Hello 2
-
- World 2
- ---
- Key 3
-
- Hello 3
- World 3
-
- '@
- $pattern = "(([\S\s]+?)[\r\n]+---[`r`n]?)"
- $out = ( $s + "`r`n---" | Select-String -Pattern "(([\S\s]+?)[\r\n]+---[\r\n]?)" -AllMatches ).Matches.Value -replace "---" ,''
- $ss = 'sss '
- $arr=@()
- $n = 65
- $out |% {
- $a,$b = ($_ |Select-String -Pattern "(.+?)\n" -AllMatches).Matches.Value
- $c = [char](++$n - 1)
- $arr += "{$c}={$($c)v}[]"
- "$ss $c="
- ' ' + $a.trim()
- "sss ${c}v="
- ' ' + $($b -join " ").trim()
- ' ' + "${c}v.ffff"
- }
- 'sss kv=@' + '"{0}"' -f ($arr -join '').TrimEnd("[]")
- 'DDD(kv)'
复制代码
作者: 小白龙 时间: 2022-11-24 18:50
回复 21# terse
空行还是没有
作者: terse 时间: 2022-11-24 20:18
本帖最后由 terse 于 2022-11-24 20:19 编辑
32行这样试
输出没问题的话 你再自己调整一下复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |