2016-10-17 3 views
0

У меня есть Excel файл с 10000 строк, выглядит следующим образом:Транспонирование часть CSV

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 "," 

Любая помощь будет оценена, так как я понятия не имею, как начать.

+0

Этот вопрос довольно широк. Вам нужно немного узнать о программировании, прежде чем задавать этот вопрос. Также не так ясно, как вы получили последние 3 строки вашего примера. –

+0

[Начало] (http://stackoverflow.com/a/11885405/1630171) [указывает] (https://technet.microsoft.com/en-us/library/ff730948.aspx). –

ответ

0

Это был другой, но мне нравится хороший вызов 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 
} 

сплит-CSV -SourceFile "C: \ data.csv" -TargetFile "C: \ data3.csv" -Delimiter ""

дает такой же результат, как и раньше, но с запятой в качестве разделитель

0

Здесь нет необходимости в import-csv (- Я даже думаю, что csv является неправильным форматом хранения здесь, поскольку afaik должен указывать каждый столбец). Вот альтернатива один лайнер:

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

EDIT: это не дает угловой случай, когда есть только одна запись в строке. См. Другой ответ.

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, как вы не имеют заголовки столбцов. И если вы это сделаете, это превратит вашу электронную таблицу в объект, где свойства будут неупорядоченными. На самом деле это не CSV, поскольку разные столбцы не совпадают, это действительно просто текстовый файл.

Смежные вопросы