powershell连续汇总所有列

时间:2015-11-28 08:16:19

标签: powershell

我在csv文件中有20多列,如

empid  ename  deptid  mgrid hiredon        col6 .... col20
10     a      10      5     10-may-2010
11     b      10      5     08-aug-2005
12     c      11      3     11-dec-2008

我希望输出为csv,如

empid,  all_other_details
10  ,   {ename:a;deptid:10;mgrid:5; like this for all 19 columns }  

除了employee id之外,所有其他列都应该包含在包含key:value对的字符串中。有没有办法加入所有列而不提每个列为$ _。 ?

2 个答案:

答案 0 :(得分:1)

我想出了这个,我希望评论是自我解释的。

它应该与2列或更多列一起使用。

可以更改分隔符(在我的计算机上,CSV分隔符为;而不是,,我知道它可能与其他Culture不同。

#declare delimiters
$CSVdelimiter = ";"
$detailsDelimiter = ","

#load file in array
$data = Get-Content "Book1.csv"

#isolate headers
$headers = $data[0].Split($CSVdelimiter)

#declare row counter
$rowCount = 0

#declare results array with headers
$results = @($headers[0] + "$CSVdelimiter`details")

#for each row except first
$data | Select-Object -Skip 1 | % {

    #split on $csvDelimiter
    $rowArray = $_.Split($CSVdelimiter)

    #declare details array
    $details = @()

    #for each column except first
    for($i = 1; $i -lt $rowArray.Count; $i++) {

        #add to details array (header:value)
        $details += $headers[$i] + ":" + $rowArray[$i]
    }

    #join details array with $detailsDelimiter to build new row
    #append to first column value
    #add to results array
    $results += "$($rowArray[0])$CSVdelimiter{$($details -join $detailsDelimiter)}"

    #increment row counter
    $rowCount++
}

#output results to new csv file
$results | Out-File "Book2.csv"

输出如下:

empid;details
10;{ename:a,deptid:10,mgrid:5,hiredon:10-may-2010}
11;{ename:b,deptid:10,mgrid:5,hiredon:08-aug-2005}
12;{ename:c,deptid:11,mgrid:3,hiredon:11-dec-2008}

答案 1 :(得分:0)

试试这个:

$csv = Get-Content .\input_file.csv
$keys = $csv[0] -split '\s+'
$c = $keys.count - 1
$keys = ($keys[1..$c] | % {$i = -1}{$i += 1; "$($_):{$i}"}) -join '; '
$csv[1..($csv.count -1)] | % {
    $a = $_ -split '\s+'
    New-Object psobject -Property @{
        empid = $a[0]
        all_other_details = "{$($keys -f $a[1..$c])}"
    }
} | Export-Csv output_file.csv -NoTypeInformation