Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用分隔符拆分Powershell中的文件_Powershell_Split_Text Parsing - Fatal编程技术网

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

使用分隔符拆分Powershell中的文件,powershell,split,text-parsing,Powershell,Split,Text Parsing,我目前有一个Powershell脚本,它正在遍历捆绑的MT103文件。目前,它检查标志并决定是否转发文件。问题是,有时MT177(不需要的)信息与所需文件捆绑在一起,文件被转发到放置点 如何修改Powershell脚本以基于分隔符“{-”检测和拆分此文件 这方面的一个例子是: 多笔付款以换行符分隔。例如: {- MT103付款1 -} {- MT103付款2 -} 我们希望将此文件拆分为多个文件,然后分别处理它们 生成的文件应包含 {- MT103付款1 -} {- MT103付款2 -}

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

如何修改Powershell脚本以基于分隔符“{-”检测和拆分此文件

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

{-
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)
      )确保
      也匹配换行符,以便进行多行匹配

      • 请注意,尽管默认情况下
        -split
        不包括分隔符regex在结果数组中匹配的内容,但使用捕获组(
        (…)
        )确实会导致包含它匹配的内容

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

    • -ne'
      过滤掉由
      -split
      操作产生的空条目
  • 将(
    {…}
    )传递到
    设置内容的
    -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++ }