使用分隔符拆分Powershell中的文件
我目前有一个Powershell脚本,它正在遍历捆绑的MT103文件。目前,它检查标志并决定是否转发文件。问题是,有时MT177(不需要的)信息与所需文件捆绑在一起,文件被转发到放置点 如何修改Powershell脚本以基于分隔符“{-”检测和拆分此文件 这方面的一个例子是: 多笔付款以换行符分隔。例如:使用分隔符拆分Powershell中的文件,powershell,split,text-parsing,Powershell,Split,Text Parsing,我目前有一个Powershell脚本,它正在遍历捆绑的MT103文件。目前,它检查标志并决定是否转发文件。问题是,有时MT177(不需要的)信息与所需文件捆绑在一起,文件被转发到放置点 如何修改Powershell脚本以基于分隔符“{-”检测和拆分此文件 这方面的一个例子是: 多笔付款以换行符分隔。例如: {- MT103付款1 -} {- MT103付款2 -} 我们希望将此文件拆分为多个文件,然后分别处理它们 生成的文件应包含 {- MT103付款1 -} {- MT103付款2 -}
{-
MT103付款1
-}
{-
MT103付款2
-}
我们希望将此文件拆分为多个文件,然后分别处理它们
生成的文件应包含
{-
MT103付款1
-}
{-
MT103付款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
#创建示例输入文件:
@'
{-
MT103付款1
-}
{-
MT103付款2
-}
'@>file.txt
$index=1
#将文件拆分为块,并将它们写入“outFile.txt”文件。
(获取内容-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)
也匹配换行符,以便进行多行匹配- 请注意,尽管默认情况下
不包括分隔符regex在结果数组中匹配的内容,但使用捕获组(-split
)确实会导致包含它匹配的内容(…)
- 如果您想通过只在它们自己的行上查找
和{-
来更严格地匹配,请使用以下正则表达式:-}
(?sm)(^{-$。+?^-}$)\r?\n
- 请注意,尽管默认情况下
过滤掉由-ne'
操作产生的空条目-split
- Regex
- 将(
)传递到{…}
设置内容的
参数允许基于每个输入对象确定输出文件路径:-LiteralPath
为第一个字符串(行块)输出'outFile{0}.txt'-f$script:index++
,为第二个字符串输出outFile1.txt
,依此类推outFile2.txt
- 由于延迟绑定脚本块在子作用域中运行,因此不能在调用方的作用域中直接递增
:$index
是在脚本范围内引用变量的方便方法$script:index
- 但是,如果您的代码在函数中,请使用以下更健壮但更麻烦的引用来引用父作用域:
(Get Variable-scope 1 index)。Value++
- 有关详细信息,请参阅
$Data=“{-MT103付款1-}{-MT103付款2-}”
[string[]$Array=$Data.Split(“{”)
如果($Array.Count-gt 1){
对于($i=1;$i-lt$Array.Count;$i++){
“{”+$Array[$i]|输出文件$destination-$i.fin
}
}
我拆分了开头大括号“{”上的数据,然后将其添加回结果字符串内容,然后将带有大括号的重构字符串输出到输出文件
{-MT103付款1-}
{-MT103付款2-}
问题的原始形式不太清楚,但现在应该清楚了。您的答案去掉了开头分隔符({-
),保留了结尾分隔符(-}
)-然而,现在很明显,需要保留这两个文件。此外,将拆分结果写入单个文件的方面也不存在。我同意你的观点,该问题本可以解释得更好一些。不过,我概述了对多个文件的需求:“需要将此文件拆分为多个文件,然后分别处理。”
# 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++ }