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

时间:2019-11-01 17:07:53

标签: powershell split text-parsing

早安,

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

如何修改Powershell脚本以基于定界符“ {-”检测并分割此文件。

一个例子是: 多个付款之间以换行符分隔。例如:

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

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

生成的文件应包含

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

3 个答案:

答案 0 :(得分:1)

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

类似以下内容:

$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

答案 1 :(得分: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的{​​{1}}参数可以确定每个输入对象的输出文件路径:

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

    • 由于延迟绑定脚本块在 child 范围内运行,因此无法在调用者的范围内直接增加outFile2.txt

      • $index是在 script 范围内引用变量的便捷方法。
      • 但是,如果您的代码位于函数中,请使用以下更健壮但更麻烦的引用 parent 作用域:{{1} }
      • 有关详细信息,请参见this answer

答案 2 :(得分:0)

这是我最终得到的代码:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

我将左括号“ {”上的数据分割开,然后将其添加回结果字符串内容中,然后将带有括号的重构字符串输出到输出文件中。

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