Разделение файлов в Powershell с разделителем - PullRequest
1 голос
/ 01 ноября 2019

Good Day,

В настоящее время у меня есть скрипт Powershell, который перебирает файлы MT103 в комплекте. В настоящее время он проверяет наличие флага и решил переслать файл или нет. Проблема в том, что иногда MT177 (нежелательная) информация поставляется вместе с нужным файлом, и файл перенаправляется в точку отбрасывания.

Как я могу изменить свой скрипт Powershell для обнаружения и разделения этого файла на основе разделителя '{-'.

Примером этого является: Несколько платежей отделяются разрывом строки,Например:

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

Желание разбить этот файл на несколько файлов, а затем обработать их по отдельности.

Полученные файлы должны содержать

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

Ответы [ 3 ]

1 голос
/ 02 ноября 2019
# 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.
  • Передача блока сценария с задержкой привязки ({ ... }) в параметр Set-Content -LiteralPath позволяет определить путь к выходному файлу придля каждого объекта ввода:

    • 'outFile{0}.txt' -f $script:index++ выводит outFile1.txt для первой строки (блока строк), outFile2.txt для второй и т. д.

    • Поскольку блоки скриптов с задержкой запускаются в child scope, вы не можете напрямую увеличить $index в thОбласть действия вызывающего абонента:

      • $script:index - это удобный способ обращения к переменной в области действия script .
      • Однако, если ваш код находится внутри функция , используйте следующую, более надежную - но более громоздкую - ссылку на область действия parent : (Get-Variable -Scope 1 index).Value++
      • См. этот ответ для деталей.
1 голос
/ 01 ноября 2019

РЕДАКТИРОВАНИЕ: Как я понял, вам нужно разделить разделителем и удалить ненужные данные.

что-то вроде следующего:

$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
0 голосов
/ 04 ноября 2019

Это код, с которым я закончил:

$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 -}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...