Как я могу транспонировать и анализировать большой вертикальный текстовый файл в файл CSV с заголовками? - PullRequest
2 голосов
/ 18 марта 2019

У меня большой текстовый файл (* .txt) в следующем формате:

; KEY 123456
; Any Company LLC
; 123 Main St, Anytown, USA

SEC1 = xxxxxxxxxxxxxxxxxxxxx
SEC2 = xxxxxxxxxxxxxxxxxxxxx
SEC3 = xxxxxxxxxxxxxxxxxxxxx
SEC4 = xxxxxxxxxxxxxxxxxxxxx
SEC5 = xxxxxxxxxxxxxxxxxxxxx
SEC6 = xxxxxxxxxxxxxxxxxxxxx

Это повторяется для 350 - 400 клавиш. Это ключи HASP и коды SEC, связанные с ними. Я пытаюсь разобрать этот файл в файл CSV с KEY и SEC1 - SEC6 в качестве заголовков, с заполняемыми строками. Это формат, который я пытаюсь получить:

KEY,SEC1,SEC2,SEC3,SEC4,SEC5,SEC6
123456,xxxxxxxxxx,xxxxxxxxxxx,xxxxxxxxxx,xxxxxxxxxx,xxxxxxxxxx,xxxxxxxxxx
456789,xxxxxxxxxx,xxxxxxxxxx,xxxxxxxxxx,xxxxxxxxxx,xxxxxxxxxx,xxxxxxxxxx

Мне удалось получить скрипт для экспорта в CSV только с одним ключом в текстовом файле (мой тестовый файл), но когда я пытаюсь запустить его в полном списке, он экспортирует только последний ключ и сек. коды.

$keysheet = '.\AllKeys.txt'
$holdarr = @{}

Get-Content $keysheet | ForEach-Object {
if ($_ -match "KEY") {
    $key, $value = $_.TrimStart("; ") -split " "
    $holdarr[$key] = $value }
elseif ($_ -match "SEC") {
    $key, $value = $_ -split " = "
    $holdarr[$key] = $value }
}

$hash = New-Object PSObject -Property $holdarr
$hash | Export-Csv -Path '.\allsec.csv' -NoTypeInformation

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

Буду признателен за любую помощь, чтобы заставить это работать.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 18 марта 2019

Вот подход, который я предлагаю:

$output = switch -Regex -File './AllKeys.txt' {
    '^; KEY (?<key>\d+)' {
        if ($o) {
            [pscustomobject]$o
        }
        $o = @{
            KEY = $Matches['key']
        }
    }

    '^(?<sec>SEC.*?)\s' {
        $o[$Matches['sec']] = ($_ | ConvertFrom-StringData)[$Matches['sec']]
    }

    default {
        Write-Warning -Message "No match found: $_"
    }
}

# catch the last object
$output += [pscustomobject]$o

$output | Export-Csv -Path './some.csv' -NoTypeInformation
1 голос
/ 18 марта 2019

Позволяет использовать силу ConvertFrom-StringData, которая

Преобразует строку, содержащую одну или несколько пар ключей и значений, в хэш-таблицу.

Итак, что мы будем делать, это

  1. Разделить на блоки текста
  2. редактировать строку "; Key"
  3. Удалить пустые строки или точки с запятой.
  4. Перейдите к ConvertFrom-StringData для создания хеш-таблицы
  5. Преобразуйте это в объект PowerShell

$path = "c:\temp\keys.txt"
# Split the file into its key/sec collections. Drop any black entries created in the split
(Get-Content -Raw $path) -split ";\s+KEY\s+" | Where-Object{-not [string]::IsNullOrWhiteSpace($_)} | ForEach-Object{
    # Split the block into lines again
    $lines = $_ -split "`r`n" | Where-Object{$_ -notmatch "^;" -and -not [string]::IsNullOrWhiteSpace($_)}
    # Edit the first line so we have a full block of key=value pairs.
    $lines[0] = "key=$($lines[0])"
    # Use ConvertFrom-StringData to do the leg work after we join the lines back as a single string.
    [pscustomobject](($lines -join "`r`n") | ConvertFrom-StringData)

} | 
    # Cannot guarentee column order so we force it with this select statement.
    Select-Object KEY,SEC1,SEC2,SEC3,SEC4,SEC5,SEC6

Используйте Export-CSV для своего сердцасейчас.

1 голос
/ 18 марта 2019

Это был бы один подход.

& {
    $entry = $null
    switch -Regex -File '.\AllKeys.txt' {
        "KEY" {
            if ($entry ) {
                [PSCustomObject]$entry
            }
            $entry = @{}
            $key, $value = $_.TrimStart("; ") -split " "
            $entry[$key] = [int]$value
        }
         "SEC" {
            $key, $value = $_ -split " = "
            $entry[$key] = $value 
        }
    }
    [PSCustomObject]$entry
} | sort KEY | select KEY,SEC1,SEC2,SEC3,SEC4,SEC5,SEC6 |
Export-Csv -Path '.\allsec.csv' -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...