2015-01-13 58 views
1

所以我得到了這樣的數據:拆分含有固定字符串長度colums

3LLO24MACT01 24MOB_6012010051700000020100510105010    123456 

它包含了不同的列不同的值,當我將其導入。每列都是固定寬度。說上校#1是ID,只有1長。意思是這裏是"3"。第2列的長度是3,這裏是"LLO"。第3欄的長度是9,而"24MACT01 "(請注意,缺少的部分被空白填滿)。這繼續15列左右......

有沒有一種方法可以根據序列長度快速切割成不同的元素?我找不到任何東西。

回答

2

這可以通過RegEx匹配來完成,並創建一個自定義對象數組。事情是這樣的:

$AllRecords = Get-Content C:\Path\To\File.txt | Where{$_ -match "^(.)(.{3})(.{9})"} | ForEach{ 
    [PSCustomObject]@{ 
     'Col1' = $Matches[1] 
     'Col2' = $Matches[2] 
     'Col3' = $Matches[3] 
    } 
} 

這將需要每一行,比賽由多少個字符指定,然後創建基於送行的匹配對象。它收集數組中的所有對象並可以導出爲CSV或其他內容。由於缺乏更好的信息,'Col1','Col2'等只是我提出的通用列標題,可能是您想要的任何東西。

編輯:謝謝iCodez向我展示了,也許是無意中,您可以爲您的代碼示例指定一種語言!

3

[Regex]::Matches會很容易做到這一點。你需要做的就是指定一個正則表達式模式,其後面跟着大括號所需的字符數。例如,要匹配三個字符的列,您可以編寫.{3}。然後你爲所有15列做這個。

爲了證明,我將使用包含您的示例數據的前三列的字符串(因爲我知道它們的大小):

PS > $data = '3LLO24MACT01 ' 
PS > $pattern = '(.{1})(.{3})(.{9})' 
PS > ([Regex]::Matches($data, $pattern).Groups).Value 
3LLO24MACT01 
3 
LLO 
24MACT01 
PS > 

注意,輸出將是文本的第一個值匹配的是所有的捕獲組。如果你不需要這些,你可以用切片將其刪除:

$columns = ([Regex]::Matches($data, $pattern).Groups).Value 
$columns = $columns[1..$columns.Length] 
2

下面是從正則表達式匹配創建PS對象的輔助功能。

New-PSObjectFromMatches

-debug選項可以寫正則表達式的過程中提供幫助。

相關問題