Невозможно извлечь первую строку из файла CSV, отфильтрованного по определенному заголовку - PullRequest
0 голосов
/ 15 мая 2018

У меня есть CSV-файл, который содержит данные, как показано ниже:

account,id,name
1234,a3bu5,test
12,b4cf8,test
789,t4wy7,test2

Мне нужно отфильтровать по заголовку name и извлечь все массивы account в массив.

В моем текущем коде я перебираю несколько имен и хочу хранить номера своих учетных записей в отдельных массивах. (т.е. (1234,12) и (789) в этом примере)

Пример кода (выберите заголовок):

$namesToParse = @("test")
$inputFile = "output.csv"
$testArray = @()
$csvFile = Import-csv $inputFile
For ($i = 0; $i-le $namesToParse.length-1; $i++) {
    (" - Getting account numbers for '{0}'`n" -f ($namesToParse[$i]) ) | write-host -ForegroundColor Blue
    #SELECT HEADER
    $csv = $csvFile | Select-String -Pattern $namesToParse[$i] | select $csvFile.account | Out-String
}

$testArray = $csv.split(",")
$testArray[0]

Пример кода (выберите строку):

$namesToParse = @("test")
$inputFile = "output.csv"
$testArray = @()
$csvFile = Import-csv $inputFile
For ($i = 0; $i-le $namesToParse.length-1; $i++) {
    (" - Getting account numbers for '{0}'`n" -f ($namesToParse[$i]) ) | write-host -ForegroundColor Blue
    #SELECT LINE
    $csv = $csvFile | Select-String -Pattern $namesToParse[$i] | select line | Out-String
}

$testArray = $csv.split(",")
$testArray[0]

Мне известно, что проблема связана с моей переменной csv, но я не уверен, что использовать для отображения моих результатов. Самые близкие примеры, которые я нашел в Интернете, включают выбор заголовка учетной записи, как показано выше, но при этом игнорируется шаблон, который фильтрует по имени и отображает все номера счетов. Если я использую , выберите строку вместо счета, шаблон работает, но все значения получены, у меня остается больше данных, чем мне требуется. Это добавляет дополнительные шаги к сценарию, который я надеюсь устранить.

Каков наилучший способ получения необходимой мне информации или я неправильно передаю эту информацию?

Ответы [ 2 ]

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

Согласен, вы, кажется, слишком усложняете вещи.

  • Import-csv для чтения данных в
  • Format-Table с параметром -GroupBy

> Import-Csv .\output.csv | Format-Table account -GroupBy name


   name: test

account
-------
1234
12


   name: test2

account
-------
789

Другой способ собрать учетные записи по имени с помощью Group-Object

Import-Csv .\output.csv | Select-Object account,name | 
    Group-Object name | ForEach-Object {
        "{0,15}:{1}" -f $_.name,($_.group.account -join ',')}

       test:1234,12
      test2:789

Или создать новую таблицу из этой информации

$NewTable =  Import-Csv .\output.csv | Select-Object account,name |
     Group-Object name | ForEach-Object {
         [PSCustomObject]@{
             'Name'     = $_.name
             'Accounts' = ($_.group.account -join ',')
          }
      }
$NewTable

Name  Accounts
----  --------
test  1234,12
test2 789
0 голосов
/ 15 мая 2018

Ваш подход выглядит довольно сложным, вы можете решить проблему более читабельным способом, используя циклы ForEach:

$namesToParse = @("test")
$inputFile = "output.csv"
$csvFile = Import-csv $inputFile

$ht = New-Object System.Collections.Hashtable

# Loop over each row in the csv file, assigning the row to a variable called $row
ForEach ($row in $csvFile) {
    $match = $false
    # Set a new variable containing the name value (for readability)
    $nameValue = $row.name
    # iterate over the namesToParse array, checking for matches
    ForEach ($name in $namesToParse) {
        # If a match is found, set the boolean variable $match to true
        if ($nameValue -match $name) {
            $match = $true
        }
    }
    # If there was a match, get the account numbers
    if ($match) {
        (" - Getting account numbers for '{0}'`n" -f ($row.name) ) | write-host -ForegroundColor Blue
        # We are collecting records into a hashtable, e.g. $ht.test2
        # So, if the $ht.test2 entry doesn't already exist, create it as a blank array
        if (-not $ht.$nameValue) {
            $ht.$nameValue = @()
        }
        # Add the account number to the array
        $ht.$nameValue += $row.account
    }
}

# Display results
$ht
  1. Цикл по строкам файла CSV
  2. Просмотрите каждую запись namesToParse и проверьте совпадения в столбце имени.
  3. Если есть совпадение, проверьте, была ли создана хеш-запись для этого значения имени (например, $ ht.test2), если нет,затем создайте новый пустой массив для добавления номеров счетов в
  4. Если совпадение и массив уже существует, просто добавьте к нему.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...