2016-10-10 79 views
0

试图简化此代码的显而易见的原因..... 发现这个小snippit作为一个开始,但我真的不知道如何将其纳入更大的计划。简化PowerShell代码

它基本上是一个电话簿CSV文件,我们需要分解成多个文件。下面的代码的工作,但它的效率非常低:低于

[char[]](65..90) 

代码:

GC C:\Users\x\documents\Telephonebook.csv | %{ 
if ($_.StartsWith("A")){ 
$_ | out-file -filepath c:\users\aricci\documents\A.asp -append 
} 

ElseIf ($_.StartsWith("B")){ 
$_ | out-file -filepath c:\users\aricci\documents\B.asp -append 
} 

ElseIf ($_.StartsWith("C")){ 
$_ | out-file -filepath c:\users\aricci\documents\C.asp -append 
} 

ElseIf ($_.StartsWith("D")){ 
$_ | out-file -filepath c:\users\aricci\documents\D.asp -append 
} 

ElseIf ($_.StartsWith("E")){ 
$_ | out-file -filepath c:\users\aricci\documents\E.asp -append 
} 

ElseIf ($_.StartsWith("F")){ 
$_ | out-file -filepath c:\users\aricci\documents\F.asp -append 
} 

ElseIf ($_.StartsWith("G")){ 
$_ | out-file -filepath c:\users\aricci\documents\G.asp -append 
} 

ElseIf ($_.StartsWith("H")){ 
$_ | out-file -filepath c:\users\aricci\documents\H.asp -append 
} 

ElseIf ($_.StartsWith("I")){ 
$_ | out-file -filepath c:\users\aricci\documents\I.asp -append 
} 

ElseIf ($_.StartsWith("J")){ 
$_ | out-file -filepath c:\users\aricci\documents\J.asp -append 
} 

ETC ....

回答

6

Martin的回答woul ð肯定工作,但如果你想软化IO开销,你可以按首字母使用Group-Object cmdlet来组中的条目,然后写所有的人都对每个文件一次:

$Sets = Get-Content C:\Users\x\documents\Telephonebook.csv |Group-Object {$_[0]} 
foreach($Set in $Sets) { 
    $Set.Group |Out-File ("c:\users\aricci\documents\{0}.asp" -f $Set.Name[0]) 
} 

正如安斯加尔中指出注意,这种方法比使用流水线更耗费内存

+1

可能值得注意的是,对于非常大的文件,应避免使用此方法(文件不适合可用内存=>系统启动交换=>操作减慢到爬行)。 –

2

下面将只使用第一个字符作为文件名(注意这也可以是你可以使用过滤器排除的数字):

GC C:\Users\x\documents\Telephonebook.csv | % { 
    $_ | out-file -filepath ("c:\users\aricci\documents\{0}.asp" -f $_[0]) -append  
}