Скрипт для идентификации конкретного текста и замены текстом из другого столбца без изменения положения столбца - PullRequest
0 голосов
/ 30 октября 2018

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

В следующем примере показано, где начинается каждый столбец: example

Мне бы хотелось, чтобы скрипт нашел все строки, которые содержат "-" в столбце 555, и заменил его на первые 19 символов, найденных в столбце 450, без изменения межстрочного интервала.

Желаемый вывод для этого примера: enter image description here

Как видите, «Бруклин» был скопирован из столбца 450 и заменен на «-» в столбце 555.

Обратите внимание:

  • Скрипт должен запускаться через несколько файлов .txt, расположенных в одной папке
  • Файлы .txt содержат различное количество строк, например, некоторые файлы могут иметь 20 строк, тогда как другие могут иметь 100

Кроме того, что касается проверки каждого .txt в данной папке - я буду использовать ниже. Пожалуйста, дайте мне знать, если это возможно с этим.

Get-ChildItem C:\Users\Desktop -Filter *.txt | 
ForEach-Object { 
Set-Content $_.FullName) }

Может кто-нибудь помочь с написанием сценариев в PowerShell.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 30 октября 2018
Get-ChildItem C:\input -Filter *.txt | 
    ForEach-Object {
        (Get-Content $_.FullName | ForEach-Object {
            if ($_[549] -eq '-') {                           # Array is 0-indexed
                -join ($_[0..548+449..467+568..$_.length])
            } else {$_}
        }) | Set-Content $_.FullName }
0 голосов
/ 30 октября 2018

это действительно довольно некрасиво, но похоже, что делает работу. [ ухмылка ]

<#
_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
#>

$InStuff = @'
Alfa      Bravo     -         Delta     Echo      -         -         Foxtrot   Golf
Hotel     Inkblot   Joker     -         Kilo      -         Lima      Mike      Nova
'@ -split [environment]::NewLine

$ColSize = 10
$ColToCheck = 30
$TriggerText = '-'
$SourceCol = 10
$DestCol = 60
$SourceStopIndex = $SourceCol + $ColSize - 1

foreach ($IS_Item in $InStuff)
    {
    if ($IS_Item[$ColToCheck] -eq $TriggerText)
        {
        $SourceText = -join $IS_Item[$SourceCol..$SourceStopIndex]

        $IS_Item
        $IS_Item.Remove($DestCol, $ColSize).Insert($DestCol, $SourceText)
        }
    }

вывод ...

Hotel     Inkblot   Joker     -         Kilo      -         Lima      Mike      Nova
Hotel     Inkblot   Joker     -         Kilo      -         Inkblot   Mike      Nova

что он делает ...

  • находит триггерный текст
  • копирует исходный текст
  • удаляет текущий целевой текст
  • вставляет замену для вышеупомянутого

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

# create some testing files
$FileOneText = @'
Alfa      Bravo     -         Delta     Echo      -         -         Foxtrot   Golf
Hotel     Inkblot   Joker     -         Kilo      -         Lima      Mike      Nova
'@ | Set-Content "$env:TEMP\Jasdeep_01.txt"
$FileTwoText = @'
Alfa      Bravo     -         -         Delta     -         Echo      Foxtrot   Golf
Hotel     Inkblot   Joker     -         Kilo      -         Lima      Mike      Nova
'@ | Set-Content "$env:TEMP\Jasdeep_02.txt"
$FileThreeText = @'
Alfa      Bravo     -         Delta     Echo      Foxtrot   Golf      Hotel     Inkblot
Joker     Kilo      Lima      -         Mike      Nova      Oscar     Papa      Quebec
'@ | Set-Content "$env:TEMP\Jasdeep_03.txt"

$ColSize = 10
$ColToCheck = 30
$TriggerText = '-'
$SourceCol = 10
$DestCol = 60

$SourceDir = $env:TEMP
$Filter = 'Jasdeep*.txt'

$FileList = Get-ChildItem -LiteralPath $SourceDir -Filter $Filter -File

foreach ($FL_Item in $FileList)
    {
    $ChangedContent = foreach ($Line in (Get-Content -LiteralPath $FL_Item.FullName))
        {
        if ($Line[$ColToCheck] -eq $TriggerText)
            {
            $SourceText = $Line.Substring($SourceCol, $ColSize)

            $Line.Remove($DestCol, $ColSize).Insert($DestCol, $SourceText)
            }
            else
            {
            $Line
            }
        }
    # for testing, i used new files for saving the changes
    $NewFileName = $FL_Item.FullName -replace $FL_Item.BaseName, ('{0}_{1}' -f $FL_Item.BaseName, 'Changed')
    #    comment out the line above &
    #    UN-comment the next line if you want to replace the originals
    #$NewFileName = $FL_Item.FullName
    $ChangedContent |
        Set-Content -LiteralPath $NewFileName
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...