使用分隔符在 Powershell 中拆分文件

Split Files in Powershell with Delimiter

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

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

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

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

希望将这个文件分割成多个文件,然后分别处理。

生成的文件应包含

{-
MT103 payment 1
-}
{-
MT103 payment 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
# 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 将该字符串拆分为 {-...-} 行的块:

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

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

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

    • -ne '' 过滤掉 -split 操作产生的空条目。
  • ({ ... }) 传递给 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++
      • 有关详细信息,请参阅

这是我最终得到的代码:

$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 -}