Хэш-таблица PowerShell для категориальных данных - PullRequest
0 голосов
/ 30 августа 2018

У меня есть данные в структуре текста с отступом вдоль строк:

"Тема"

\ т "Категория"

\ т \ т "подкатегорий"

e.g. for two records I would have 

"Planet of the Apes"
\t"Scifi"
\t\t"Movie"
\t\t"TV series"
\t"Popular"
\t\t"Remake"
\t\t"Cult Classic"

BBC News
\t"Topical"
\t\t"Daily News"
\t"Geographical"
\t\t"UK"
\t\t"England"

ITV News
\t"Topical"
\t\t"Daily News"
\t\t"UK"
\t"Geographical"
\t\t"UK"
\t\t"England"

(прошу прощения, из-за автоматического форматирования в Stackoverflow иллюстрированное форматирование, табуляция или пробел делаются несколько сложнее!

Я пытаюсь найти лучший способ преобразовать это во что-то, с чем я могу работать, чтобы фильтровать и сортировать. Поскольку данные в настоящее время представляют собой простой текст, у меня есть оператор if, который работает, если это Subject, Category или Subcategory, но какой самый разумный способ создать хеш-таблицу из таких данных?

$processedData = @{}
$versionattribs | ForEach-Object{
if($_ -match "^\s*$" -or $_ -match "Inherits.*")
    {
    # Is a blank line
    }
elseif($_ -notmatch "`t")
        {
        # Is a Subject
        Write-Host "Subject: $_ "
        $Subject = $_
        }
elseif($_ -match "`t" -and $_ -notmatch "`t`t")
        {
        # Is a category
        Write-host "Category: $_"
        $category = $_
        }
elseif($_ -match "`t`t")
        {
        # Is a sub-category label
        Write-Host "Label: $_ "
        $label = $_
        }
else
        {
        #Unexpected attribute
        Write-host "Error - unexpected line indentation : $_"
        }
}

1 Ответ

0 голосов
/ 31 августа 2018

Я принял ваш подход и использовал встроенную функциональность, предоставляемую оператором switch:

$data = @{}
switch -Regex -File C:\Temp\weirddata.txt
{
    '(^\s*$)|(Inherits)'
    {
        continue
    }

    "^[^`t]"
    {
        $subject = ($PSItem -replace '"').Trim()
        $data[$subject] = @{}
        continue
    }

    "^`t[^`t]"
    {
        $category = ($PSItem -replace '"').Trim()
        $data[$subject][$category] = [System.Collections.Generic.List[string]]@()
        continue
    }

    "^`t`t"
    {
        $label = ($PSItem -replace '"').Trim()
        $data[$subject][$category].Add($label)
        continue
    }

    default
    {
        Write-Warning "No match found for $PSItem"
    }
}

$data

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

...