【问题标题】:Split a string containing fixed length columns拆分包含固定长度列的字符串
【发布时间】:2015-03-12 00:49:27
【问题描述】:

我得到这样的数据:

3LLO24MACT01 24MOB_6012010051700000020100510105010 123456

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

每一列都是固定宽度:

  • Col#1 是 ID,只有 1 长。意思是这里是"3"
  • Col#2 长度为 3,此处为 "LLO"
  • Col#3 的长度为 9,"24MACT01 "(请注意,缺少的部分会被空白填充)。
  • 这会持续 15 列左右...

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

【问题讨论】:

    标签: string parsing powershell split


    【解决方案1】:

    这可以通过 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 向我展示了您可以为您的代码示例指定一种语言,这可能是在不经意间!

    【讨论】:

      【解决方案2】:

      [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]
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-15
          • 1970-01-01
          • 2012-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多