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

空白行可能存在也可能不存在。