PowerShell для вставки текстового файла в указанную строку c - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь разбить большой текстовый файл на несколько файлов на основе указанной строки c. Каждый раз, когда я вижу строку ABCDE-3, я хочу вырезать и вставить содержимое этой строки в новый текстовый файл. Я также хочу извлечь последние 4 из социальных сетей, фамилию и имя. Новый текстовый файл необходимо сохранить как first_name, last_name и last 4 of social.

См. Пример текстового файла и немного исходного кода. Мне было бы удобнее делать это в Python, но PowerShell - единственный вариант.

$my_text = Get-Content .\ab.txt
$ssn_pattern = '([0-8]\d{2})-(\d{2})-(\d{4})'
ForEach ($file in my_text)

enter image description here

1 Ответ

2 голосов
/ 27 мая 2020

Чтобы получить имя, фамилию и последние 4 цифры социальной сети, вы можете использовать группы захвата и использовать эти группы при составлении имени файла.

Из вашего шаблона должны быть только последние 4 цифры быть сгруппированным.

Вы можете использовать шаблон, чтобы начать сопоставление с TO: и из следующей строки получите значения для имен и номера.

Затем сопоставьте все строки, которые не начинаются с ABCDE - 3 с использованием отрицательного просмотра вперед (?!

Вы можете настроить шаблон и код в соответствии с вашим точным текстом.

(?m)^[^\S\r\n]+TO:.*\r?\n\s*ATTN:\s*[A-Z]{3} ([^,\r\n]+),[^\S\r\n]*(.+?)[^\S\r\n]*[0-8]\d{2}-\d{2}-(\d{4})(?:\r?\n(?![^\S\r\n]+ABCDE - 3).*)*\r?\n[^\S\r\n]+ABCDE - 3.*

Regex demo

Я создал фрагмент кода, используя проводки stackoverflow, так что это можно улучшить. В основном это сводится к загрузке необработанной строки и получению всех совпадений.

Затем l oop по всем совпадениям и заставляет группы собрать имя файла и сохранить полное совпадение в качестве содержимого.

Если есть имена, содержащие пробелы, и вы не хотите, чтобы они присутствовали в имени файла, вы можете заменить их пустой строкой.

Пример кода:

$my_text = Get-Content -Raw ./Documents/stack-overflow/powershell/ab.txt

$pattern = "(?m)^[^\S\r\n]+TO:.*\r?\n\s*ATTN:\s*[A-Z]{3} ([^,\r\n]+),[^\S\r\n]*(.+?)[^\S\r\n]*[0-8]\d{2}-\d{2}-(\d{4})(?:\r?\n(?![^\S\r\n]+ABCDE - 3).*)*\r?\n[^\S\r\n]+ABCDE - 3.*"
Select-String $pattern -input $my_text -AllMatches |
        ForEach-Object { $_.Matches } |
        ForEach-Object {
            $fileName = -join ($_.groups[2].Value, $_.groups[1].Value, $_.groups[3].Value)
            Write-Host $fileName
            Set-Content -Path "your-path-here/$fileName.txt" -Value $_.Value
        }

Когда я запускаю это, я получаю 2 файла с содержимым для каждого совпадения:

MIOTTISAREMO2222.txt
MIOTTSANREMO1111.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...