返回列表 发帖

[问题求助] 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)
#>COPY

回复 1# 小白龙


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

TOP

$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"
}COPY

TOP

$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"
}COPY
1

评分人数

TOP

是这样吗

TOP

本帖最后由 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)'COPY

TOP

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

回复 10# 小白龙


    有空格也有空行呀

TOP

不会了   
.

TOP

回复 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.txtCOPY

TOP

回复 14# idwma

多谢大佬, 上面你的代码是OK的, 是我用的软件的问题

TOP

本帖最后由 小白龙 于 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)'COPY

TOP

回复 6# idwma


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

-join $ar

TOP

本帖最后由 idwma 于 2022-11-22 18:04 编辑
$ofs=''
'sss kv=@' + '"{0}"' -f "$ar".TrimEnd("[]")COPY
加个出处
https://devblogs.microsoft.com/powershell/psmdtagfaq-what-is-ofs/
1

评分人数

TOP

回复 13# idwma

多谢大佬

TOP

回复 13# idwma


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

TOP

返回列表