Powershell переименовывает текстовые файлы на основе строк в тексте -> Более лаконичный способ для сценария?

Я пытаюсь переименовать банковские выписки в формате MT940, используя номер счета и дату выписки.

Операторы содержат следующее (пример):

    :20:
    :25:MHCBNL2AXXX/**0364525123**
    :28C:27/
    :60F:C200207EUR100000,00
    :61:2012311231D0000,1NMSCTOPF1234567890SDD TOPF1234567890
    :86:FR1234567890ARVAL FRANCE
    :62F:C**200207**EUR100000,00

Я написал следующий сценарий powershell, объединив несколько примеров, но для этой цели он кажется довольно длинным. Вопрос: Есть ли краткий способ написать этот скрипт?

 $files = Get-ChildItem "C:\Dropbox\Temp\Gerard\test\*" -Include *.txt, *.ged
 for ($i=0; $i -lt $files.Count; $i++) 
 { 
   $filename = $files[$i].FullName        
  
  #Rename the file based on strings in the file
   $Account =  (Get-Content -Raw -Path $fileName) 
   $Account -match ":25:.+(\d{10})" 
   $Account = $matches[1]

   $StatementDate  =  (Get-Content -Raw -Path $fileName) 
   $StatementDate -match ":62F:C(?<content>.*)EUR"
   $StatementDate  = $matches['content']

   $file=Get-Item $filename
   $file.Basename 
   $extension=$file.Extension
   
   Rename-Item -Path $filename -NewName "$StatementDate-$Account$extension"
}

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы могли бы добиться подобного с помощью следующего:

$Files = Get-ChildItem '/Users/acc/Downloads/bank/*' -Include '*.txt', '*.ged'
foreach ($File in $Files) {
    $Content = Get-Content -Path $File -Raw

    $Account = [Regex]::Match($Content, ':25:.+\*{2}(?<Account>\d{10})\*{2}').Groups['Account'].Value
    $StatementDate = [Regex]::Match($Content, ':62F:C\*{2}(?<StatementDate>\d+)\*{2}EUR').Groups['StatementDate'].Value

    Rename-Item -Path $File -NewName ('{0}-{1}{2}' -f $StatementDate, $Account, $File.Extension)
}
  • Используя цикл foreach для перебора объектов в коллекции вместо цикла for (в диапазоне), вы получаете некоторые эстетические преимущества, такие как возможность легкого доступа к свойствам объекта в коллекции.
    • Например, вместо того, чтобы получать экземпляр объекта вашего файла, вызывая Get-Item $filename, чтобы получить только его расширение, это упрощается с помощью цикла foreach, а текущая итерация по-прежнему является объектом System.IO.FileSystemInfo.FileInfo. Поэтому мы можем получить его расширение, обратившись к текущей итерации $File.extension.
  • Вы читали из файла несколько раз с помощью Get-Content, где вам нужно было сделать это только один раз для каждого файла.
  • На мой взгляд, использование .NET Match() метод класса Regex чище, чем использование оператора -match, но это личное предпочтение.
    • Я пытался использовать метод Matches(), чтобы я мог передать оба шаблона регулярных выражений (разделенных по каналу |) в одном вызове, но по какой-то причине в обеих возвращенных группах не совпали оба шаблона; одна группа содержала совпадение для «Учетной записи», а не для «StatementDate», и наоборот в другой группе.

Спасибо @codaamok, но если я запущу это, то $Account и $StatementDate будут пустыми (когда я заменю Rename-Item на Write-Ouput $Account и $StatementDate. Я проверил это, потому что строка Rename-Item вызвала ошибку.

Kees Netelvrees 23.04.2022 12:13

Я могу только предположить, что данные примера не отражают ваши реальные данные. Можете ли вы поделиться больше? Обратите внимание, что в шаблонах регулярных выражений я внимательно отношусь к * символам.

codaamok 23.04.2022 12:18

Прости, Кодамок, это была глупая ошибка с моей стороны. Я намеревался выделить номер учетной записи и дату жирным шрифтом и не заметил, что он оставил ** внутри. Если я изменю это в регулярном выражении, он отлично работает. Я также нашел хорошее объяснение того, как вы используете Match and Groups: [link(]mcpmag.com/articles/2015/09/30/…). Ваша помощь действительно очень ценится!

Kees Netelvrees 23.04.2022 12:28

Рад, что смог помочь @KeesNetelvrees - отметьте мой ответ, если вы считаете, что это правильный ответ :-)

codaamok 23.04.2022 13:33

Другие вопросы по теме