我得到的数据是这样的:
3LLO24MACT01 24MOB_6012010051700000020100510105010 123456
导入时,它包含不同列的不同值。
每列都是固定宽度:
"3"
。"LLO"
。"24MACT01 "
(注意缺失的那些被空白填满)。有没有一种方法可以根据序列长度快速将其切割成不同的元素?我找不到任何。
答案 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
选项可以帮助编写正则表达式。