2013-04-23 36 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+"