Powershell - 信息的子串和枢轴
Powershell - Substring and pivot of information
免责声明 - 完全是 powershell 的业余爱好者。我基本上是在深入学习,所以请原谅我的无知。
这是我的挑战 - 我有这样的 txt 文件格式的信息(EMC 存储阵列布局):
等级名称:极致性能
突袭类型:r_5
用户容量 (GB):4382.54
消耗容量 (GB):3923.65
可用容量 (GB):458.89
订阅百分比:89.53%
针对更高层 (GB) 的数据:0.00
针对较低层级的数据 (GB):8.02
我想提供给存储团队的是一份关于他们的好东西在哪里的报告。所以希望以这样的方式结束:
Tier name Raid Type UCap ConCap AvCap %Sub ...etc
Extreme Performance r_5 4382.54 3923.65 458.89 89.53 ...
所以它是一个组合,抓取 ":" 之前的所有内容作为标题,并在 ":" 之后获取 CRLF作为数据,并将其转换为 table。
它变得更好了:txt 文件中有更多这样的数据块,由 CRLF 分隔,但使用相同的标签。所以只需要从这些中抓取数据并将它们修改为上面的table。
我收集到,也许我需要处理 Get-Content 然后用 -replace 操作字符串,但似乎 Get-Content 将第一个条目(层名称:) 读取为一个驱动器。哎呀
再一次,我热衷于学习,欢迎指点。已经进行了几个小时了...
非常感谢。
好吧,如果您不同意执行 table 的想法,您可以采取的一种方法是使用漂亮的 ConvertFrom-StringData cmdlet,它可以让您快速将数据导入 Name =值格式。
要使用它,我们所要做的就是用等号替换冒号,我们可以这样做。
#Setup $string
$string ="Tier Name: Extreme Performance
Raid Type: r_5
User Capacity (GBs): 4382.54
Consumed Capacity (GBs): 3923.65
Available Capacity (GBs): 458.89
Percent Subscribed: 89.53%
Data Targeted for Higher Tier (GBs): 0.00
Data Targeted for Lower Tier (GBs): 8.02"
我没有包含此信息的文件,所以我只是在上述步骤中将其直接加载到内存中。为了您的目的,只需 运行 $string=Get-Content -Path .\PathToFile\File.txt
将内容导入 $string。
现在我们可以调用通用的 -Replace 运算符来替换 string/variable/object 中的字符,语法如下。
$string -replace ":","="
这给了我们这个结果:
>Tier Name= Extreme Performance
Raid Type= r_5
User Capacity (GBs)= 4382.54
Consumed Capacity (GBs)= 3923.65
Available Capacity (GBs)= 458.89
Percent Subscribed= 89.53%
Data Targeted for Higher Tier (GBs)= 0.00
Data Targeted for Lower Tier (GBs)= 8.02
看到了,它采用名称 = 值格式,这正是我们对 ConvertFrom-StringData cmdlet 所需要的。我们现在可以直接将其通过管道传输到我们的 convert cmdlet 中以开始处理数据!
$string -replace ":","=" | ConvertFrom-StringData | ft -AutoSize
Name Value
---- -----
Tier Name Extreme Performance
Consumed Capacity (GBs) 3923.65
Data Targeted for Higher Tier (GBs) 0.00
Percent Subscribed 89.53%
Raid Type r_5
Available Capacity (GBs) 458.89
Data Targeted for Lower Tier (GBs) 8.02
User Capacity (GBs) 4382.54
我希望这能让你开始你的道路!
我的理解是,您有很多像您向我们展示的那样的块,并且每个块恰好有 8 个条目(不多也不少)。此外,您想创建一个 CSV 文件(我说的对吗?)。如果我是对的,试试这个代码:
$f="$env:TMP\=in.txt"
gc $f | %{
$csv="$env:TMP\=csv.CSV"
clc $csv -ea Ignore
${#items}=8
$o=[pscustomobject]@{}
}{
$splitted=$_-split':'
if($splitted){
$o|Add-Member $splitted[0] $splitted[1]
if(($o.psobject.properties.count|measure -sum).count -eq ${#items}){
$o|epcsv $csv -Append
$o=[pscustomobject]@{}
}
}
}{
ipcsv $csv -Header 'Tier name','Raid Type','UCap','ConCap','AvCap','%Sub','Higher','Lower'|
select -Skip 1|
ft -AutoSize
}
注意 $f
是包含所有条目的文件; ${#items}
是每块的项目数; $csv
是生成的 CSV 文件;我在显示它们时替换了 CSV 文件 headers .
这是 $f
的输出,如下所示:
Tier name Raid Type UCap ConCap AvCap %Sub Higher Lower
--------- --------- ---- ------ ----- ---- ------ -----
Extreme Performance1 r_5 4382.54 3923.65 458.89 89.53% 0.00 8.1
Extreme Performance12 r_5 4382.54 3923.65 458.89 89.53% 0.00 8.12
Extreme Performance123 r_5 4382.54 3923.65 458.89 89.53% 0.00 8.123
Extreme Performance1234 r_5 4382.54 3923.65 458.89 89.53% 0.00 8.1234
下面是 $f
文件内容的示例:
Tier Name: Extreme Performance1
Raid Type: r_5
User Capacity (GBs): 4382.54
Consumed Capacity (GBs): 3923.65
Available Capacity (GBs): 458.89
Percent Subscribed: 89.53%
Data Targeted for Higher Tier (GBs): 0.00
Data Targeted for Lower Tier (GBs): 8.1
Tier Name: Extreme Performance12
Raid Type: r_5
User Capacity (GBs): 4382.54
Consumed Capacity (GBs): 3923.65
Available Capacity (GBs): 458.89
Percent Subscribed: 89.53%
Data Targeted for Higher Tier (GBs): 0.00
Data Targeted for Lower Tier (GBs): 8.12
Tier Name: Extreme Performance123
Raid Type: r_5
User Capacity (GBs): 4382.54
Consumed Capacity (GBs): 3923.65
Available Capacity (GBs): 458.89
Percent Subscribed: 89.53%
Data Targeted for Higher Tier (GBs): 0.00
Data Targeted for Lower Tier (GBs): 8.123
Tier Name: Extreme Performance1234
Raid Type: r_5
User Capacity (GBs): 4382.54
Consumed Capacity (GBs): 3923.65
Available Capacity (GBs): 458.89
Percent Subscribed: 89.53%
Data Targeted for Higher Tier (GBs): 0.00
Data Targeted for Lower Tier (GBs): 8.1234
空白行可能存在也可能不存在。
免责声明 - 完全是 powershell 的业余爱好者。我基本上是在深入学习,所以请原谅我的无知。
这是我的挑战 - 我有这样的 txt 文件格式的信息(EMC 存储阵列布局):
等级名称:极致性能
突袭类型:r_5
用户容量 (GB):4382.54
消耗容量 (GB):3923.65
可用容量 (GB):458.89
订阅百分比:89.53%
针对更高层 (GB) 的数据:0.00
针对较低层级的数据 (GB):8.02
我想提供给存储团队的是一份关于他们的好东西在哪里的报告。所以希望以这样的方式结束:
Tier name Raid Type UCap ConCap AvCap %Sub ...etc
Extreme Performance r_5 4382.54 3923.65 458.89 89.53 ...
所以它是一个组合,抓取 ":" 之前的所有内容作为标题,并在 ":" 之后获取 CRLF作为数据,并将其转换为 table。
它变得更好了:txt 文件中有更多这样的数据块,由 CRLF 分隔,但使用相同的标签。所以只需要从这些中抓取数据并将它们修改为上面的table。
我收集到,也许我需要处理 Get-Content 然后用 -replace 操作字符串,但似乎 Get-Content 将第一个条目(层名称:) 读取为一个驱动器。哎呀
再一次,我热衷于学习,欢迎指点。已经进行了几个小时了...
非常感谢。
好吧,如果您不同意执行 table 的想法,您可以采取的一种方法是使用漂亮的 ConvertFrom-StringData cmdlet,它可以让您快速将数据导入 Name =值格式。
要使用它,我们所要做的就是用等号替换冒号,我们可以这样做。
#Setup $string
$string ="Tier Name: Extreme Performance
Raid Type: r_5
User Capacity (GBs): 4382.54
Consumed Capacity (GBs): 3923.65
Available Capacity (GBs): 458.89
Percent Subscribed: 89.53%
Data Targeted for Higher Tier (GBs): 0.00
Data Targeted for Lower Tier (GBs): 8.02"
我没有包含此信息的文件,所以我只是在上述步骤中将其直接加载到内存中。为了您的目的,只需 运行 $string=Get-Content -Path .\PathToFile\File.txt
将内容导入 $string。
现在我们可以调用通用的 -Replace 运算符来替换 string/variable/object 中的字符,语法如下。
$string -replace ":","="
这给了我们这个结果:
>Tier Name= Extreme Performance
Raid Type= r_5
User Capacity (GBs)= 4382.54
Consumed Capacity (GBs)= 3923.65
Available Capacity (GBs)= 458.89
Percent Subscribed= 89.53%
Data Targeted for Higher Tier (GBs)= 0.00
Data Targeted for Lower Tier (GBs)= 8.02
看到了,它采用名称 = 值格式,这正是我们对 ConvertFrom-StringData cmdlet 所需要的。我们现在可以直接将其通过管道传输到我们的 convert cmdlet 中以开始处理数据!
$string -replace ":","=" | ConvertFrom-StringData | ft -AutoSize
Name Value
---- -----
Tier Name Extreme Performance
Consumed Capacity (GBs) 3923.65
Data Targeted for Higher Tier (GBs) 0.00
Percent Subscribed 89.53%
Raid Type r_5
Available Capacity (GBs) 458.89
Data Targeted for Lower Tier (GBs) 8.02
User Capacity (GBs) 4382.54
我希望这能让你开始你的道路!
我的理解是,您有很多像您向我们展示的那样的块,并且每个块恰好有 8 个条目(不多也不少)。此外,您想创建一个 CSV 文件(我说的对吗?)。如果我是对的,试试这个代码:
$f="$env:TMP\=in.txt"
gc $f | %{
$csv="$env:TMP\=csv.CSV"
clc $csv -ea Ignore
${#items}=8
$o=[pscustomobject]@{}
}{
$splitted=$_-split':'
if($splitted){
$o|Add-Member $splitted[0] $splitted[1]
if(($o.psobject.properties.count|measure -sum).count -eq ${#items}){
$o|epcsv $csv -Append
$o=[pscustomobject]@{}
}
}
}{
ipcsv $csv -Header 'Tier name','Raid Type','UCap','ConCap','AvCap','%Sub','Higher','Lower'|
select -Skip 1|
ft -AutoSize
}
注意 $f
是包含所有条目的文件; ${#items}
是每块的项目数; $csv
是生成的 CSV 文件;我在显示它们时替换了 CSV 文件 headers .
这是 $f
的输出,如下所示:
Tier name Raid Type UCap ConCap AvCap %Sub Higher Lower
--------- --------- ---- ------ ----- ---- ------ -----
Extreme Performance1 r_5 4382.54 3923.65 458.89 89.53% 0.00 8.1
Extreme Performance12 r_5 4382.54 3923.65 458.89 89.53% 0.00 8.12
Extreme Performance123 r_5 4382.54 3923.65 458.89 89.53% 0.00 8.123
Extreme Performance1234 r_5 4382.54 3923.65 458.89 89.53% 0.00 8.1234
下面是 $f
文件内容的示例:
Tier Name: Extreme Performance1
Raid Type: r_5
User Capacity (GBs): 4382.54
Consumed Capacity (GBs): 3923.65
Available Capacity (GBs): 458.89
Percent Subscribed: 89.53%
Data Targeted for Higher Tier (GBs): 0.00
Data Targeted for Lower Tier (GBs): 8.1
Tier Name: Extreme Performance12
Raid Type: r_5
User Capacity (GBs): 4382.54
Consumed Capacity (GBs): 3923.65
Available Capacity (GBs): 458.89
Percent Subscribed: 89.53%
Data Targeted for Higher Tier (GBs): 0.00
Data Targeted for Lower Tier (GBs): 8.12
Tier Name: Extreme Performance123
Raid Type: r_5
User Capacity (GBs): 4382.54
Consumed Capacity (GBs): 3923.65
Available Capacity (GBs): 458.89
Percent Subscribed: 89.53%
Data Targeted for Higher Tier (GBs): 0.00
Data Targeted for Lower Tier (GBs): 8.123
Tier Name: Extreme Performance1234
Raid Type: r_5
User Capacity (GBs): 4382.54
Consumed Capacity (GBs): 3923.65
Available Capacity (GBs): 458.89
Percent Subscribed: 89.53%
Data Targeted for Higher Tier (GBs): 0.00
Data Targeted for Lower Tier (GBs): 8.1234
空白行可能存在也可能不存在。