读取txt文件,将行更改为列,保存txt文件

时间:2018-01-16 17:23:22

标签: powershell transpose

我有一个包含超过300万条记录的txt文件(以分号分隔),其中第1列到第4列有一些一般信息。第5列和第6列有详细信息。在第1列到第4列中,相同的一般信息最多可以有4个不同的详细信息。

我的示例输入:

Server;Owner;Company;Username;Property;Value
Srv1;Dave;Sandbox;kwus91;Memory;4GB
Srv1;Dave;Sandbox;kwus91;Processes;135
Srv1;Dave;Sandbox;kwus91;Storage;120GB
Srv1;Dave;Sandbox;kwus91;Variant;16
Srv2;Pete;GWZ;aiwq71;Memory;8GB
Srv2;Pete;GWZ;aiwq71;Processes;234
Srv3;Micael;P12;mxuq01;Memory;16GB
Srv3;Micael;P12;mxuq01;Processes;239
Srv3;Micael;P12;mxuq01;Storage;160GB
Srv4;Stefan;MTC;spq61ep;Storage;120GB

期望的输出:

Server;Owner;Company;Username;Memory;Processes;Storage;Variant
Srv1;Dave;Sandbox;kwus91;4GB;135;120GB;16
Srv2;Pete;GWZ;aiwq71;8GB;234;;
Srv3;Micael;P12;mxuq01;16GB;239;160GB;
Srv4;Stefan;MTC;spq61ep;;;120GB;

如果一般信息不存在值(第1-4列),则必须保持空白。

我目前的代码:

$a = Import-csv .\Input.txt -Delimiter ";"
$a | FT -AutoSize

$b = @()
foreach ($Server in $a.Server | Select -Unique) {
    $Props = [ordered]@{ Server = $Server }
    $Owner = ($a.where({ $_.Server -eq $Server})).Owner | Select -Unique
    $Company = ($a.where({ $_.Server -eq $Server})).Company | Select -Unique
    $Username = ($a.where({ $_.Server -eq $Server})).Username | Select -Unique

    $Props += @{Owner = $Owner}
    $Props += @{Company = $Company}
    $Props += @{Username = $Username}
    foreach ($Property in $a.Property | Select -Unique){ 
        $Value = ($a.where({ $_.Server -eq $Server -and 
                    $_.Property -eq $Property})).Value

        $Props += @{ $Property = $Value }
    }
    $b += New-Object -TypeName PSObject -Property $Props
}
$b | FT -AutoSize
$b | Export-Csv .\Output.txt -NoTypeInformation -Delimiter ";"

经过大量的尝试并得到错误:我的脚本有效 但这需要很多时间 是否有可能在txt文件中为大约300万行提供更好的性能?我正在为$Server计算或多或少250万个唯一值。

我正在使用PowerShell 4.0运行Windows 7 64位。

1 个答案:

答案 0 :(得分:0)

尝试这样的事情:

#Import Data and create empty columns
$List=import-csv "C:\temp\file.csv" -Delimiter ";"

#get all properties name with value not empty    
$ListProperty=($List | where Value -ne '' | select property -Unique).Property

#group by server
$Groups=$List | group Server

#loop every rows and store data by group and Property Name
$List | %{

    $Current=$_

    #Take value not empty and group by Property Name
    $Group=($Groups | where Name -eq $Current.Server).Group | where Value -ne '' |  group Property

   #Add all property and first value not empty
    $ListProperty | %{
        $PropertyName=$_
        $PropertyValue=($Group | where Name -eq $PropertyName | select -first 1).Group.Value
        $Current | Add-Member -Name $PropertyName -MemberType NoteProperty -Value $PropertyValue
    }

$Current

} | select * -ExcludeProperty Property, Value -unique  | export-csv "c:\temp\result.csv" -notype -Delimiter ";"