Как сохранить вывод строки выбора из объемных текстовых файлов в массив powershell - PullRequest
0 голосов
/ 19 мая 2018

Я пытаюсь вытащить подстроки из текстовых файлов массовым сохранением этих подстрок в массив.Я пробовал варианты следующего.Это выводит все выбранные строки на экран, но сохраняет только окончательный вывод в переменную.Есть ли способ имитировать функциональность оператора = = в outvariable, чтобы все элементы сохранялись в массиве?

$FILES = ls "*.txt"
foreach($f in $FILES){
  $in=Get-Content $f
  $in | Foreach { Select-String -Path "$f" -Pattern "Ad ID" -outvariable 
  array1 }}

В случае, если моя стратегия ошибочна, общая цель извлечения подстрок в массив состоит в том, чтобы иметь несколько массивов отдельных подстрок этих текстовых файлов.Затем я объединю значения в CSV.Я пытаюсь вытянуть элементы, а не переупорядочивать текстовые файлы, поскольку подстроки в текстовых файлах расположены в другом порядке.Пример:

Txt File One:

Ad Id: xxxx
Ad Text: blah blah
Ad placement: spaceship

Txt File Two:

Ad Id: yyyy
Ad placement: zoo
Ad Text: blah blah

Окончательный желаемый результат (эта часть работает, за исключением порядка элементов)

CSV-файл

xxxx, spaceship, blah blah
yyyy, zoo, blah blah

Ответы [ 3 ]

0 голосов
/ 19 мая 2018

Попробуйте это:

$files      = ls "*.txt"
$dictionary = @{}

foreach($f in $files) {
    $in = Get-Content $f
    $in.Split([Environment]::NewLine) | ForEach-Object {
        $key,$value = $_.Split(':')
        $dictionary[$key] = $value
    }
    $dictionary['Ad Id'] + ', ' + $dictionary['Ad placement'] + ', ' + $dictionary['Ad Text'] | Out-File -FilePath '.\results.csv' -Append
}

Отсортированный вывод:

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

foreach($f in $files) {
    $in = Get-Content $f
    $in.Split([Environment]::NewLine) | ForEach-Object {
        $key,$value = $_.Split(':')
        $dictionary[$key] = $value
    }
    [void]$list.Add( $dictionary['Ad Id'] + ', ' + $dictionary['Ad placement'] + ', ' + $dictionary['Ad Text'] )
}
[void]$list.Sort()
$list | Out-File -FilePath '.\results.csv' -Append
0 голосов
/ 20 мая 2018

Другой немного другой подход.

  • RegEx анализирует $ Line и создает переменную с именем перед двоеточием (без Ad) и значением того, что стоит за
  • Послекаждый обработанный файл vars выводится как пользовательский объект

$Data = ForEach ($File in (Get-ChildItem File*.txt)){
    $Id,$Text,$Placement="","",""
    ForEach ($Line in (Get-Content $File)){
        If ($Line -Match "AD (?<Label>.*?): (?<Value>.*)"){
            Set-Variable -Name "$($Matches.Label)" -Value $Matches.Value
        }
    }
    [PSCustomObject]@{ID        = $Id
                      Placement = $placement
                      Text      = $Text}
}
$Data
$Data | Export-CSv ".\Result.csv" -NoTypeInformation

Пример вывода:

ID   Placement Text
--   --------- ----
xxxx spaceship blah blah
yyyy zoo       blah blah
0 голосов
/ 19 мая 2018

Вот способ построить массив, о котором вы говорите.Я не думаю, что это лучший способ решить эту проблему.Это не влияет на порядок результатов и не создает файл .csv.

$FILES = Get-ChildItem -File -Filter "*.txt"

$array1 = $()

foreach($f in $FILES) {
    Get-Content -Path $f |
        Select-String -Pattern "Ad Id.*" |
        ForEach-Object { $array1 += @($_.Matches.Value) }
}

$FILES.Count

$array1.Count
$array1
...