根据单个单元格的内容将一个CSV行分成多行

时间:2018-03-18 14:44:32

标签: powershell csv

我在How to separate one row into multiple rows based on a single cell containing multiple values in the same row in a CSV file using PowerShell

上建立了自己的解决方案

尝试迭代一行,检索拉链,将其拆分为''并使用zipcodes为每个创建一个新的PSCustomObject,并将zipcode放在列中,并在同一个csv中添加新行。

示例(是的,引擎盖=无值)

City,State,hood,zip,lat,lng
Carmel,IN,,"46290 46032 46033 46280 46082",39.9783711,-86.1180435

我的非工作解决方案是对链接中的解决方案的修改

$x = Get-Content 'D:\Carmel-IN.csv'
$y = $x | ConvertFrom-Csv -Delimiter ' '
$y | Foreach {
    $current = $_
    $current.zip -split ' ' | foreach  {
        [PSCUstomObject]@{ 
            zip  = $_
        }
    }
} | ConvertTo-Csv -NoTypeInformation -Delimiter ' ' | % {
    $_ -replace '"',''
}

ISE和控制台上的输出相同......单词zip并且没有任何内容写入文件。

我是PS的新手,使用5.1。我有一种感觉,校正非常简单,但我无法看到它。正在寻找结果文件...

City,State,hood,zip,lat,lng
Carmel,IN,,"46290 46032 46033 46280 46082",39.9783711,-86.1180435
,,,46290,,
,,,46032,,
,,,46033,,
,,,46280,,
,,,46082,,

更新

我设法重做脚本以获得我可以使用的结果

$x = Get-Content 'D:\temp\Carmel-IN.csv'
$exportlocation = 'D:\temp\Carmel-IN.csv'
$y = $x | ConvertFrom-Csv -Delimiter ','
$y | Foreach {
    $current = $_
    $current.zip -split ' ' | foreach  {
        [PSCUstomObject]@{ 
            City  = $null
            State = $null
            hood  = $null
            zip   = $_
            lat   = $null
            lng   = $null
        }
    } 
} | Export-CSV -Append -NoTypeInformation -Delimiter ',' -Force $exportlocation  | % { $_ -replace '"',''}

,结果是

City,State,hood,zip,lat,lng
Carmel,IN,,"46290 46032 46033 46280 46082",39.9783711,-86.1180435
,,,"46290",,
,,,"46032",,
,,,"46033",,
,,,"46280",,
,,,"46082",,

我将关注另一个剧本中的额外“

| % { $_ -replace '"',''}似乎没有删除它们

感谢所有建议

1 个答案:

答案 0 :(得分:0)

使用Select-Object

$x = Get-Content 'D:\Carmel-IN.csv'
$y = $x | ConvertFrom-Csv -Delimiter ' '
foreach($row in $y){
  foreach($zip in -split $row.zip){
    $row |select *,@{Name='zip';Expression={$zip}} -ExcludeProperty zip
  }
}

或者,如果要保留列的顺序,请设置要在循环之前选择的属性的属性列表:

$columns = $y[0].psobject.Properties.Name |ForEach-Object {
    if($_ -eq 'zip'){
        $_ = @{Name = 'zip';Expression = { -split $zip }}
    }
    $_
}
foreach($row in $y){
  foreach($zip in -split $row.Zip){
    $row |select $columns
  }
}