我有一个大文件,其中包含像这样的文本数据块。
[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
感谢您的建议。
答案 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($_)}