无法从CSV文件中提取由特定标头过滤的第一行

时间:2018-05-14 23:09:06

标签: arrays powershell csv

我有一个包含以下数据的csv文件:

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

我需要按名称标题进行过滤,并将所有帐户数字提取到数组中。

在我当前的代码中,我正在迭代多个名称,并希望将他们的帐号存储在单独的数组中。 (即本例中的(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 :(得分:1)

您的方法看起来非常复杂,您可以使用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. 如果匹配并且数组已经存在,只需附加到它。

答案 1 :(得分:1)

我同意,你似乎过于复杂化了。

  • 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