【问题标题】:Split Files in Powershell with Delimiter使用分隔符在 Powershell 中拆分文件
【发布时间】:2020-02-27 23:34:23
【问题描述】:

我目前有一个遍历捆绑的 MT103 文件的 Powershell 脚本。目前,它检查标志并决定是否转发文件。问题是有时,MT177(不需要的)信息与所需文件捆绑在一起,并且文件被转发到放置点。

如何修改我的 Powershell 脚本以根据分隔符“{-”检测和拆分此文件。

这方面的一个例子是: 多笔付款由换行符分隔。例如:

{-
MT103 payment 1
-}
{-
MT103 payment 2
-}

希望将此文件拆分为多个文件,然后单独处理。

生成的文件应该包含

{-
MT103 payment 1
-}
{-
MT103 payment 2
-}

【问题讨论】:

    标签: powershell split text-parsing


    【解决方案1】:
    # Create sample input file:
    @'
    {-
    MT103 payment 1
    -}
    {-
    MT103 payment 2
    -}
    '@ > file.txt
    
    $index = 1
    
    # Split the file into blocks and write them to "outFile<index>.txt" files.
    (Get-Content -Raw file.txt) -split '(?s)({-.+?-})\r?\n' -ne '' | 
      Set-Content -LiteralPath { 'outFile{0}.txt' -f $script:index++ }
    
    • Get-Content -Raw 将整个输入文件读入单个多行字符串。
    • -split 将该字符串拆分为 {-...-} 行块:

      • Regex (?s)({-.+?-})\r?\n 捕获单个块,后跟换行符;内联选项s ((?s)) 确保. 也匹配换行符,用于多行匹配。

        • 请注意,即使 -split 默认情况下不包含在结果数组中匹配的分隔符正则表达式,使用捕获组 ((...)) 确实会包含匹配的内容。

        • 如果您想通过仅在各自的行上查找 {--} 来更严格地匹配,请改用以下正则表达式:(?sm)(^{-$.+?^-}$)\r?\n

      • -ne '' 过滤掉 -split 操作产生的空条目。
    • delay-bind script block ({ ... }) 传递给Set-Content-LiteralPath 参数允许基于每个输入对象确定输出文件路径:

      • 'outFile{0}.txt' -f $script:index++ 为第一个字符串(行块)输出outFile1.txt,为第二个字符串输出outFile2.txt,依此类推。

      • 因为延迟绑定脚本块在 child 范围内运行,所以您不能在调用方范围内直接增加 $index

        • $script:index 是在 script 范围内引用变量的便捷方式。
        • 但是,如果您的代码位于 函数 中,请使用以下更健壮但更麻烦的方法来引用 parent 范围:(Get-Variable -Scope 1 index).Value++
        • 详情请见this answer

    【讨论】:

      【解决方案2】:

      已编辑:据我了解,您需要使用分隔符拆分并删除不需要的数据。

      类似于以下内容:

      $Data = "{- MT103 payment 1 -} {- MT103 payment 2 -}"
      [Collections.ArrayList]$Array = $Data.Split('{-')
      for($i = 0;$i -lt $Array.Count;$i++) {
          if($Array[$i] -imatch "MT177") {
              $Array.RemoveAt($i)
              $i = 0
          }
      }
      #Print result
      $Array
      

      【讨论】:

      • 问题的原始形式不太清楚,但现在应该是。您的答案去掉了开始分隔符 ({-) 并保留了结束分隔符 (-}) - 而现在很明显 保留两者 是需要的。此外,缺少将拆分结果写入单个 文件 的方面
      • 我同意你的观点,这个问题本可以解释得更好一点。但是,我确实概述了对多个文件的需求:“希望将此文件拆分为多个文件,然后单独处理它们。”
      【解决方案3】:

      这是我最终得到的代码:

      $Data = "{- MT103 payment 1 -} {- MT103 payment 2 -}"
      [string[]]$Array = $Data.Split("{")
      if ($Array.Count -gt 1) {
        for ($i = 1; $i -lt $Array.Count; $i++) {
          "{" + $Array[$i] | Out-File $destination-$i.fin
        }
      }
      

      我在左大括号“{”上拆分数据,然后将其添加回生成的字符串内容,然后将带有大括号的重构字符串输出到输出文件。

      {- MT103 payment 1 -} 
      {- MT103 payment 2 -}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-04
        • 2018-08-08
        • 2022-11-27
        • 1970-01-01
        相关资源
        最近更新 更多