При создании словаря в PowerShell все дублирующие ключи учитываются? - PullRequest
0 голосов
/ 16 июня 2019

Я перебираю некоторые файлы и помещаю значения в словарь вокруг разделителя ":".

Данные в текстовых файлах выглядят так:

AD ID: 9999
Ad Placement: Computers
Landing Page: www.something.com
Interests: this and that and this 
Interests: also this thing and one final thing

Мой скрипт для создания словаря выглядит следующим образом:

$files = ls "*.txt" 
$dictionary = @{} 
[System.Collections.Generic.List[String]]$list = @() 

foreach ($f in $files) {
    $in = Get-Content -Raw $f
    $in.Split([Environment]::NewLine) | ForEach-Object {
        $key, $value = $_.Split(':')
        $dictionary[$key] = $value 
    }

    [void]$list.Add($dictionary['Ad ID'] + ',' + $dictionary['Ad Text'] + ',' +
        $dictionary['Ad Landing Page'] + ',' + $dictionary['Interests'])
}

Это основная идея внаименее.Я получил непредсказуемые результаты, когда дважды сталкиваюсь с файлом, в котором есть ключ, как в случае с записью в примере выше, которая называется «Интересы».

Что происходит при добавлении элементов словаря в список из файла?

В приведенном выше примере, каково значение $dictionary['interests'] при прохождении через скрипт?

1 Ответ

1 голос
/ 17 июня 2019

Поскольку данные могут содержать дубликаты ключей, вы не можете использовать командлет ConvertFrom-StringData .

Получить данные в словаре (хэш-таблице) вручную не так сложно, иВы можете сами решить, что делать с дублирующимися ключами: либо перезаписать значения, чтобы последняя найденная запись «выиграла», либо нет:

# this decides which duplicate value you want to store in the hashtable
$allowOverwrite = $false

$hash = @{}
# get the content of the file as string array and loop through
Get-Content -Path 'THE FULL PATH AND FILENAME OF YOUR TEXTFILE' | ForEach-Object {
    if ( -not [string]::IsNullOrWhiteSpace($_)) {
        # split string to get the key and the value
        $key, $value = $_ -split ':', 2 | ForEach-Object { $_.Trim() }

        # if a key is found that already exists in the hashtable
        if ($hash.ContainsKey($key)) {
            # either overwrite the value 'Last-One-Wins'
            # or do nothing 'First-One-Wins'
            if ($allowOverwrite) { $hash[$key] = $value }
        }
        else {
            $hash[$key] = $value
        }
    }
}


$hash["interests"]
  • показывает «то и это и это» в случае$allowOverwrite = $false
  • показывает «также эту вещь и одну последнюю вещь» в случае $allowOverwrite = $true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...