Powershell在文本文件中搜索并水平导出为CSV

时间:2016-03-16 11:50:28

标签: powershell

我有一个大文件,其中包含像这样的文本数据块。

[SERVER1]
LIBELLE=DATA, SOMME DATA
VARIABLES=A,B,C,D,E
PHYSICAL NAME=E:\SOMME\PATH\FILE.INI
ARTICLE SIZE=50
MACHINE=SOME SERVER 
PARAMETER =
OPTION = 

[SERVER2]
LIBELLE=DATA2, SOMME DATA2
VARIABLES=A,B,C,D,E
PHYSICAL NAME=Z:\SOMME\PATH\FILE2.INI
ARTICLE SIZE=150
MACHINE=SOME SERVER XY
PARAMETER =
OPTION 1 = VOID 
OPTION 2 = 
OPTION 3 = 
OPTION 4 = 
OPTION 5 = 

我想做的是检索每个块[SERVERX]并将其放入这种格式的CSV文件中(水平)

ColumnA__    |  ColumnB (LIBELLE)___  |  ColumnC (VARIABLES) | ColumnD ect...

[SERVER1]  |  DATA1, SOMME DATA1 |  A,B,C,D,E___________           | Ect...

[SERVER2]  |  DATA2, SOMME DATA2 |  A,B,C,D,E___________           | Ect...

我已经尝试了这个,输出工作正如我想要的那样但它需要自动化并导出到scv,这对我不起作用。

$mydata = Get-Content my_file.txt
write-Host $mydata[0] $mydata[1] $mydata[2] $mydata[3] $mydata[4] $mydata[5] | Export-Csv -Path $rep\results.csv -Force -UseCulture -NoTypeInformation 

还尝试使用select-string,但我不知道这是否是正确的工作方式..

select-String -path $my_file -Pattern '\[*\]', 'IDENTIFIANTS=','LIBELLE=','VARIABLES=' | Select-Object -Property LineNumber, Line | Export-Csv -Path $rep\results.csv -Force -UseCulture -NoTypeInformation 

感谢您的建议。

1 个答案:

答案 0 :(得分:1)

因此,我会使用-Get-Content的-Raw开关将整个文件作为多行字符串读取。然后根据[字符拆分文件以表示记录。从ConvertFrom-StringData cmdlet获取属性(必须在每个记录前加上" SERVER =")并从中创建一个对象。然后我们找出任何给定记录可以具有的所有属性,确保将它们全部添加到第一条记录中(如果它没有)(这样做是因为当您导出到CSV时它基于第一条记录的列条目'属性列表)。然后,您可以导出CSV。

$Data = (Get-Content my_file.txt -Raw) -split "(\[[^[]+)" | ?{![string]::IsNullOrWhiteSpace($_)}
$Records = $Data -replace '\\','\\'|%{$Record="SERVER="+$_.trim()|ConvertFrom-StringData;New-Object PSObject -Prop $Record}
$Props = $Records|%{$_.psobject.properties.name}|select -Unique
$Props | Where{$_ -notin $Records[0].PSObject.Properties.Name}|%{Add-Member -InputObject $Records[0] -NotepropertyName $_ -NotepropertyValue $Null}
$Records|Export-CSV .\my_file.csv -notype

修改:对于那些正在运行PowerShell 2.0的人(此时此版本已过时3个版本),您无法使用-Raw参数。这是另一种选择:

$Data = (Get-Content my_file.txt) -Join "`r`n" -split "(\[[^[]+)" | ?{![string]::IsNullOrWhiteSpace($_)}

替代方案:感谢@Matt的建议,对这些事情有不同的观点总是好的。正如Matt建议的那样,您可以使用Out-String来组合Get-Content生成的字符串数组,最后得到一个多行字符串。这是用法!

$Data = (GC my_file.txt | Out-String) -split "(\[[^[]+)" | ?{![string]::IsNullOrWhiteSpace($_)}