【问题标题】:Splitting a csv column into two columns (powershell)将 csv 列拆分为两列(powershell)
【发布时间】:2015-12-24 05:26:28
【问题描述】:

我有一个包含地址行的 csv,其中一些具有适当的数字,而另一些则没有。我一直在使用 powershell 尝试将列分成两部分。一份用于地址,一份用于公寓。 所以初始列看起来像这样。

839 Main St Apt 3
130 Marcy Ave
399 Broadway Ave Apt 6F

我正在寻找的结果

地址栏

839 Main St                 
130 Marcy Ave
399 Broadway Ave            

公寓栏

Apt 3 空格处 公寓 6F

我正在尝试了解如何拆分它。如果我使用空格作为分隔符,那么它会将 adderess 列分成多列。例如,如果我使用字母 A,那么将留下 pt 6F。解决这个问题的正确方法是什么。

任何帮助将不胜感激。

【问题讨论】:

  • 脏数据总是一个问题。如果总是使用“Apt”缩写,那么你可以分开。
  • 我就是这么想的。有没有办法根据那个词拆分它并仍然保留它?如果我使用 split 函数,我正在考虑附加丢失的字母,但不是每一行都有 APT。在 excel 中,我会使用搜索和替换将 ~ 附加到 APT 的前面,然后使用文本到列并使用 ~ 作为分隔符。我不知道如何通过 powershell 来做到这一点。
  • 是的,您需要拆分单词(包括它周围的空格)并将 Apt 添加回拆分后的第二位。您还需要使用一些逻辑来处理没有它的行。
  • 简单的解决方案可以是-split"(Apt.*)"

标签: csv powershell


【解决方案1】:

你可以用这个:

$aptReg=[regex]'^(.*)(Apt.*)$'
"839 Main St Apt 3","130 Marcy Ave","399 Broadway Ave Apt 6F" | % {if($aptReg.IsMatch($_)){$a=$aptReg.Matches($_);[PSCustomObject]@{"A1"=$a.Groups[1].Value;"A2"=$a.Groups[2].Value}}else{[PSCustomObject]@{"A1"=$_;"A2"=""}}} 

它给出了:

A1                     A2                                                                                                                              
--                     --                                                                                                                              
839 Main St            Apt 3                                                                                                                           
130 Marcy Ave                                                                                                                                                                                                                                                    
399 Broadway Ave       Apt 6F  

鉴于以下 CSV 文件:

"Name","Surname","Address","Zipcode"
"N1","S1","839 Main St Apt 3","Z1"
"N2","S2","130 Marcy Ave","Z2"
"N2","S2","399 Broadway Ave Apt 6F","Z2"

一条很长的班轮……

导入-Csv C:\Temp\test.csv | % {if($aptReg.IsMatch($.Address)){$a=$aptReg.Matches($.address);$a1=$a.Groups[1].Value;$a2 =$a.Groups[2].Value}else{$a1=$.address;$a2=""};Add-Member -InputObject $ -MemberType NoteProperty -Name "A1" -Value $a1;Add-Member -InputObject $_ -MemberType NoteProperty -Name "A2" -Value $a2;$_} |导出-Csv "C:\Temp\test Bis.csv"

【讨论】:

  • 太棒了!谢谢!。这正是我想要的。现在我对powershell非常陌生,所以我还有另一个问题。我正在使用 Import-CSV 和其他列从 csv 中提取信息。所以我试图弄清楚我将如何修改它以适应这种情况。我假设我们在此处手动列出了地址,我将在此处加载数据并针对初始地址列运行 $aptReg。这会填充两个新列 A1 和 A2(在我的情况下为地址和公寓)
  • 您必须使用 Add-Member cmdlet 来添加结果。我编辑我的答案。
  • 所以它完全符合第一行的预期。接下来的行它不解析地址,但附加 @{Address= 完整地址; A1=; A2=} 在 A1 列中
  • 已更正......我想是的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
相关资源
最近更新 更多