2015-12-23 157 views
1

我有一个csv,其中有些地址的行有一些有数字,有些没有。我一直在使用powershell来尝试将列分成两部分。一个用于地址,另一个用于公寓。 所以最初的列看起来像这样。将csv列拆分为两列(powershell)

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

我在寻找

地址栏

839 Main St     
130 Marcy Ave 
399 Broadway Ave    

公寓列

公寓3 空白 公寓6F

结果

我想看看我将如何能够分裂这一点。如果我使用空格作为分隔符,那么它会将adderess列分成多个列。例如,如果我使用字母A,那么生病时会留下pf 6F。解决这个问题的正确方法是什么?

任何帮助将不胜感激。

+0

脏数据总是一个问题。如果总是使用'​​Apt'缩写,那么你可以分开。 – EBGreen

+0

这就是我的想法。有没有办法根据这个词分割它,并保持它?我正在考虑附加丢失的字母,如果我使用拆分功能,但不是每行都有APT。在Excel中,我会使用搜索和替换附加〜APT的infront,然后使用文本到列并使用〜作为分隔符。我不知道如何通过PowerShell去做这件事。 – User125

+0

是的,您需要拆分单词(包括它周围的空格)并将Apt添加回拆分后的第二个位。你也需要使用一些逻辑来处理没有它的行。 – EBGreen

回答

2

您可以使用此:

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

很长的一个衬垫...

Import-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 - 名称“A2” - 值$ a2; $ _} | Export-Csv“C:\ Temp \ test Bis.csv”

+0

太棒了!谢谢!。这正是我所期待的。现在我对powershell非常陌生,所以我还有另外一个问题。我使用Import-CSV和其他列来从csv中获取信息。所以我想弄清楚如何修改这个以适应这种情况。我假设我们在这里手动列出地址,我将载入我的数据并在初始地址栏中运行$ aptReg。这将填充两个新的列A1和A2(在我的情况下,地址和公寓) – User125

+0

你必须使用Add-Member cmdlet来添加结果。我编辑我的答案。 – JPBlanc

+0

因此,它确实为第一行做了假设。接下来的行它不解析地址,但追加@ {地址=完整的地址; A1 =; A2 =}在A1列 – User125