转置 CSV 的一部分

Transpose part of CSV

我有一个包含 10000 行的 Excel 文件,如下所示:

softwarename1, a, b, c, d, e, f, g, h, i
softwarename2, f, e, r, g, u, o, d
softwarename3,
softwarename4, x

我想成为这样的人:

softwarename1 a
softwarename1 b
softwarename1 c
softwarename1 d
softwarename1 e
softwarename1 f
softwarename1 g
softwarename1 h 
softwarename1 i
softwarename2 f
softwarename2 e
softwarename2 r
softwarename2 g
softwarename2 u
softwarename2 o
softwarename2 d
softwarename3 
softwarename4 x
softwarename4 ac
softwarename4 gd
softwarename4 d

目前我只知道如何导入CSV文件:

$source = Import-Csv -Path C:\tmp\ib20161016.csv -Delimiter ","

任何帮助将不胜感激,因为我不知道如何开始。

这里不需要 import-csv(-- 我什至认为 csv 是这里错误的存储格式,因为 afaik 应该指定每一列)。这是另一种单线:

Get-Content C:\tmp\ib20161016.csv |
           ForEach {$s = $_.split(","); $s[1..($s.length-1)] | ForEach{$s[0] + " " + $_}}

编辑:这并没有给出行中只有一个条目的极端情况。请参阅其他答案。

$source = get-content C:\tmp\ib20161016.csv 
$Output = foreach ($row in $source) {
    $rowarray = $row.split(',').trim()
    $softwarename = $rowarray[0]
    $values = $rowarray[1..($rowarray.length - 1)]
    if ($null -ne $values) {
        foreach ($value in $values) {
            "$softwarename $value"
        }
    } else {
        $softwarename
    }
}
$Output | Out-File C:\tmp\ib20161016.txt

注意:我不确定最后 3 个值的来源,我假设 softwarename4, x 应该是 softwarename4, x, ac, gd, d

您不想使用 Import-CSV,因为您没有 headers 列。如果这样做,它会将您的电子表格变成 object,其中的属性将是无序的。它不是真正的 CSV,因为不同的列不匹配,它实际上只是一个 txt 文件。

这是一个不同的挑战,但我很喜欢 Powershell 挑战。根据您的数据,以下将根据您的详细信息产生所需的结果:

$data = gc  -Path "C:\Users\Iris Classon\Documents\data.csv" 

$csv = ""

$nl = [Environment]::NewLine

$data | % {

    $columns = $_.ToString().Split(',')

    For ($i=1; $i -lt $columns.Length; $i++) {

        $csv  += "{0} {1}{2}" -f $columns[0],$columns[$i],$nl
    }
}

Write-Host $csv

结果:

softwarename1  a
softwarename1  b
softwarename1  c
softwarename1  d
softwarename1  e
softwarename1  f
softwarename1  g
softwarename1  h
softwarename1  i
softwarename2  f
softwarename2  e
softwarename2  r
softwarename2  g
softwarename2  u
softwarename2  o
softwarename2  d
softwarename3 
softwarename4  x

这是一个功能相同的功能,但由于进行了一些验证检查,因此不易出错。

<#
    .SYNOPSIS 
    Splits CSV in an unusual way..

    .DESCRIPTION

    .INPUTS
    Source file, target file and delimiter

    .OUTPUTS

    .EXAMPLE
    Split-CSV -SourceFile "C:\data.csv" -TargetFile "C:\data3.csv" -Delimiter " "

    Split-CSV -SourceFile "C:\data.csv" -TargetFile "C:\data3.csv" -Delimiter ","

#>

function Split-CSV {
    [CmdletBinding(SupportsShouldProcess,ConfirmImpact = "high")]
    param(
    [Parameter(Mandatory = $true,HelpMessage = "`t Please provide path")]
    [ValidateNotNullOrEmpty()]
    [string]$SourceFile,
    [Parameter(Mandatory = $true,HelpMessage = "`t Please provide path")]
    [ValidateNotNullOrEmpty()]
    [string]$TargetFile,
    [Parameter(Mandatory = $true,HelpMessage = "`t Please provide delimiter for new csv")]
    [ValidateNotNullOrEmpty()]
    [string]$Delimiter
  )

    $data = gc -Path $SourceFile

    $csv = ""

    $nl = [Environment]::NewLine

    $data | % {


    if ($_){

        $columns = $_.ToString().Split(',')

            if ($columns.Length -gt 1){

                For ($i=1; $i -lt $columns.Length; $i++) {
                    $csv  += "{0}{1}{2}{3}" -f $columns[0],$Delimiter,$columns[$i],$nl
                }
            }
        }
    }

    $csv | Out-File  $TargetFile
}

Split-CSV -SourceFile "C:\data.csv" -TargetFile "C:\data3.csv" -Delimiter ","

产生与之前相同的结果,但以逗号作为分隔符