拆分包含固定长度列的字符串

时间:2015-01-13 22:33:29

标签: string parsing powershell split

我得到的数据是这样的:

3LLO24MACT01 24MOB_6012010051700000020100510105010              123456

导入时,它包含不同列的不同值。

每列都是固定宽度:

  • Col#1是ID,只有1个长。这意味着它是"3"
  • Col#2的长度为3,此处为"LLO"
  • Col#3的长度为9,"24MACT01 "(注意缺失的那些被空白填满)。
  • 这种情况持续了15列......

有没有一种方法可以根据序列长度快速将其切割成不同的元素?我找不到任何。

3 个答案:

答案 0 :(得分:3)

这可以通过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向我展示,或许无意中,您可以为代码示例指定一种语言!

答案 1 :(得分: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 :(得分:2)

New-PSObjectFromMatches是一个辅助函数,用于从正则表达式匹配创建PS对象。

-Debug选项可以帮助编写正则表达式。