出于显而易见的原因,试图简化此代码..... 发现这个小小的snippit是一个开始,但我并不确定如何将它纳入更大的方案。
它基本上是一个电话簿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
答案 0 :(得分:6)
Martin的答案肯定会有效,但是如果你想减轻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])
}
正如Ansgar在评论中指出的那样,这种方法比仅仅使用管道更加占用内存
答案 1 :(得分:2)
以下只使用第一个字符作为文件名(请注意,这也可以是一个可以使用过滤器排除的数字):
GC C:\Users\x\documents\Telephonebook.csv | % {
$_ | out-file -filepath ("c:\users\aricci\documents\{0}.asp" -f $_[0]) -append
}