转置 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 ","
产生与之前相同的结果,但以逗号作为分隔符
我有一个包含 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 ","
产生与之前相同的结果,但以逗号作为分隔符