【问题标题】:separate one CSV row into multiple rows based on contents of a single cell根据单个单元格的内容将一个 CSV 行分成多行
【发布时间】:2018-03-18 14:44:32
【问题描述】:

我自己的解决方案基于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

尝试遍历一行,检索 zip,将其拆分为 ' ',并使用邮政编码为每个邮政编码创建一个新的 PSCustomObject,并将邮政编码放在同一个 csv 中具有新行的列中。

样本(是,引擎盖 = 无价值)

城市,州,引擎盖,邮编,纬度,液化天然气 卡梅尔,印第安纳州,,"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。我觉得更正很简单,但我看不到。正在寻找结果文件...

城市,州,引擎盖,邮编,纬度,液化天然气 卡梅尔,印第安纳州,,"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 '"',''}

结果是

城市,州,引擎盖,邮编,纬度,液化天然气 卡梅尔,印第安纳州,,"46290 46032 46033 46280 46082",39.9783711,-86.1180435 ,,,"46290",, ,,,"46032",, ,,,"46033",, ,,,"46280",, ,,,"46082",,

我将在另一个脚本中处理额外的“”

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

感谢所有建议

【问题讨论】:

  • 你的终极愿望是什么。您显示为所需输出的那个文件虽然在技术上是正确的 CSV,但我怀疑它不是处理数据的最佳方式。我怀疑 XML、JSON 或其他一些结构化数据存储方法会更好
  • 哦,该数据犯了大罪:在单个列中存储多个值。
  • @EBGreen 虽然这可能是正确的,但本周是我第一次尝试任何类型的脚本(除了使用我大约 3 年前停止使用的 iMacros),在 Fiverr 的一位“专家”接受了一周终于放弃说他无法为我做我的项目。这是我必须编写的 5 个脚本中的第二个。希望数据最终能够进入 MySQL,我也可以学习使用该工具。
  • @Joel Coehoorn 大声笑...好吧..我的借口是我必须按照我找到的方式使用数据并从那里谨慎行事;-)
  • 请不要将答案编辑成问题。

标签: powershell csv


【解决方案1】:

使用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
  }
}

【讨论】:

  • 当我尝试你的脚本时,我得到的只是单元格“46290”中的第一个值,其余的被忽略。 'lat' 和 'lng' 也被完全忽略。我在解释中遗漏了什么吗?
  • 我非常感谢您在论坛上为许多问题提供的所有解决方案:我学到了很多我已经在其他脚本中使用的知识,我相信我会继续这样做......来自新手的赞誉!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多