拆分包含固定长度列的字符串
Split a string containing fixed length columns
我得到这样的数据:
3LLO24MACT01 24MOB_6012010051700000020100510105010123456
当我导入它时,它包含不同列的不同值。
每列固定宽度:
- Col#1 是 ID,只有 1 长。意思是这里是
"3"
。
- Col#2 的长度为 3,此处
"LLO"
。
- Col#3 的长度为 9,
"24MACT01 "
(注意缺失的部分会被空白填满)。
- 这会持续 15 列左右...
有没有一种方法可以根据序列长度快速切割成不同的元素?我没找到。
这可以通过 RegEx 匹配和创建自定义 object 数组来完成。像这样:
$AllRecords = Get-Content C:\Path\To\File.txt | Where{$_ -match "^(.)(.{3})(.{9})"} | ForEach{
[PSCustomObject]@{
'Col1' = $Matches[1]
'Col2' = $Matches[2]
'Col3' = $Matches[3]
}
}
这将获取每一行,根据指定的字符数进行匹配,然后根据这些匹配创建一个 object。它收集数组中的所有 objects 并且可以导出为 CSV 或其他格式。 'Col1'、'Col2' 等只是通用列 headers 我建议的,因为缺少更好的信息,可以是您想要的任何内容。
编辑: 感谢 iCodez 向我展示了您可以为您的代码示例指定一种语言,也许是无意中!
[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]
New-PSObjectFromMatches 是一个辅助函数,用于从正则表达式匹配中创建 PS 对象。
-Debug
选项可以帮助编写正则表达式。
我得到这样的数据:
3LLO24MACT01 24MOB_6012010051700000020100510105010123456
当我导入它时,它包含不同列的不同值。
每列固定宽度:
- Col#1 是 ID,只有 1 长。意思是这里是
"3"
。 - Col#2 的长度为 3,此处
"LLO"
。 - Col#3 的长度为 9,
"24MACT01 "
(注意缺失的部分会被空白填满)。 - 这会持续 15 列左右...
有没有一种方法可以根据序列长度快速切割成不同的元素?我没找到。
这可以通过 RegEx 匹配和创建自定义 object 数组来完成。像这样:
$AllRecords = Get-Content C:\Path\To\File.txt | Where{$_ -match "^(.)(.{3})(.{9})"} | ForEach{
[PSCustomObject]@{
'Col1' = $Matches[1]
'Col2' = $Matches[2]
'Col3' = $Matches[3]
}
}
这将获取每一行,根据指定的字符数进行匹配,然后根据这些匹配创建一个 object。它收集数组中的所有 objects 并且可以导出为 CSV 或其他格式。 'Col1'、'Col2' 等只是通用列 headers 我建议的,因为缺少更好的信息,可以是您想要的任何内容。
编辑: 感谢 iCodez 向我展示了您可以为您的代码示例指定一种语言,也许是无意中!
[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]
New-PSObjectFromMatches 是一个辅助函数,用于从正则表达式匹配中创建 PS 对象。
-Debug
选项可以帮助编写正则表达式。