带循环并剪切为.dat的Powershell选择字符串

时间:2018-12-03 07:59:33

标签: powershell loops export-to-csv select-string

首先,对不起我的英语不好

对于Powershell,我是一个全新的人,对编程不是那么熟悉,但是我愿意学习

所以我的问题是:

我得到了一个.conf数据,其内容如下:

[XYZ1 - XYZXYZ, XYZXYZ]
room a201*,f110
XYZXYZXYZ
XYZXYZXYZ
XYZXYZXYZ
XYZXYZXYZ

[XYZ2 - XYZXYZ, XYZXYZ]
room a202*,f110
XYZXYZXYZ
XYZXYZXYZ
XYZXYZXYZ

我的目标是将文本导出到csv或类似的其他数据中:

a201,[XYZ1 - XYZXYZ, XYZXYZ]
f110,[XYZ1 - XYZXYZ, XYZXYZ]
a202,[XYZ1 - XYZXYZ, XYZXYZ]
f110,[XYZ1 - XYZXYZ, XYZXYZ]

因此,对于带有[]括号的每个文本,都应占据房间(在下面的行)并检查是否还有另一个房间(a201,f110),删除单词“ room”,并删除下面的其他行和星号“ *”并像上面一样导出。

我的第一步是这样的:

Select String -input C:\xyz\text.conf -pattern "\[*\]","room  *" | select line

然后我尝试用Substring删除“ room”一词,但这没有用,而且我不知道如何为每个房间创建一个循环并将其导出为2列。

我希望你们能帮助我。

问候马塞尔(Marcel)

1 个答案:

答案 0 :(得分:1)

以下可能是一种解决方案。这将使用Context的{​​{1}}属性保留前一行,然后您可以在其中拆分和替换搜索到的行以获得所需的输出。

Select-String

测试脚本

Select-String -input C:\xyz\text.conf -pattern 'room' -Context 1,0 | % {
    $current = $_
    $current.Line -split ',' | % {
      "$($_ -replace 'room ' -replace '\*'),$($current.Context.PreContext)"
    }
}

输出

("[XYZ1 - XYZXYZ, XYZXYZ]",
"room a201*,f110",
"XYZXYZXYZ",
"XYZXYZXYZ",
"XYZXYZXYZ",
"XYZXYZXYZ",
"",
"[XYZ2 - XYZXYZ, XYZXYZ]",
"room a202*,f110",
"XYZXYZXYZ",
"XYZXYZXYZ",
"XYZXYZXYZ") | 
    sls 'room' -Context 1,0 | % {
        $current = $_
        $current.Line -split ',' | % {"$($_ -replace 'room ' -replace '\*'),$($current.Context.PreContext)"}
    }