早安,
我目前有一个Powershell脚本,该脚本在捆绑的MT103文件中进行迭代。当前,它检查标志并决定是否转发文件。问题在于,有时MT177(不需要的)信息会与所需文件捆绑在一起,并且文件会转发到放置点。
如何修改Powershell脚本以基于定界符“ {-”检测并分割此文件。
一个例子是: 多个付款之间以换行符分隔。例如:
{-
MT103 payment 1
-}
{-
MT103 payment 2
-}
希望将这个文件分割成多个文件,然后分别进行处理。
生成的文件应包含
{-
MT103 payment 1
-}
{-
MT103 payment 2
-}
答案 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 范围内引用变量的便捷方法。答案 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
}
}