2013-04-23 34 views
1

在Powershell(v2,如果它很重要),它可以分割可变长度的字符串的分隔符?我的输入文件由行组成,其中每个字段由一个或多个制表符分隔,以保留整齐的列。没有引导标签。我以为你可以在分隔符规范使用正则表达式,所以我尝试:Powershell:在多个字符上分割

get-content $INFILE | foreach-object { 
    $LINE = $_.split("`t*"); 
    $F1 = $LINE[0] 
    $F2 = $LINE[1] 
    $F3 = $LINE[2] 
     . . . 
} 

如果只有一个每个字段之间的选项卡,它的工作原理是必需的。如果有两个或更多,则将每个视为一个单独的分隔符,并且$ LINE的某些成员保留为空。

+0

你确定它不是因为'*'?大多数正则表达式风格将匹配两次'\ t'这样的表达式:一次用'\ t'和另一个用空字符串。用'+'替换它(这就是你想要的行为)。 (当然,如果有多个'\ t',它将首先匹配所有的字符串,然后是一个空字符串) – Loamhoof 2013-04-23 12:48:02

+0

感谢您的想法,但“t +”的确如此。 – rojomoke 2013-04-23 13:09:50

回答

2

首先清理重复项并且应该没问题。

$DedupedLine = $_ -replace '[\t]+',"`t" # Replace multi tabs with a single tab 
$LINE = $DedupedLine.split('`t') 
+0

我假设$ t,你的意思是$ _? – rojomoke 2013-04-23 13:41:19

+0

谢谢,这工作! – rojomoke 2013-04-23 13:49:39

+0

是:)我的测试字符串足够惊人,$ t。 – marceljg 2013-04-23 14:00:07

4

试试这个超载。 split方法不采用正则表达式模式,只是char(s)或string(s)。您也可以使用多个作业并保存一些代码行:

$f1,$f2,$f3 = $_.Split("`t",[System.StringSplitOptions]::RemoveEmptyEntries) 
1

除了使用.NET string.Split方法的选项,PowerShell的-split操作确实喜欢`t*支持正则表达式:

PS> 'comma,separated,,values' -split ',+' 
comma 
separated 
values 

要访问每行前三个字段,你可以使用:

$F1,$F2,$F3,$rest = $_ -split "`t+"