带有标题的Powershell CSV到哈希表

时间:2013-10-29 23:27:18

标签: powershell csv

我有一个带标题行的csv文件,我想将其转换为Hashtable。

例如,这是我的输入:

#Version1.0
#Fields:ID,Data
1,data1
2,data2
3,data3

我希望输出是一个散列表,其中Key = ID,Value = Data。

这就是我所拥有的,但结果并不是我想要的。

$mytable = Import-Csv -Path $filePath -Header ID,Data
$HashTable=@{}
foreach($r in $mytable)
{
    $HashTable[$r.ID]=$r.Data
}

这会创建我的表,但是当我稍后输出它时     $ str = $ Hashtable |输出字符串     Write-Host $ str

我得到以下内容:

Name                  Value
--------              -----------
#Fields:ID            Data
1                     data1
2                     data2
3                     data3

如何摆脱写入哈希表的标题?是否有一个更优雅的解决方案而不是坚持if($ r.ID.StartsWith(“#”)){continue; }?

谢谢! -C

7 个答案:

答案 0 :(得分:4)

Import-Csv中的默认行为是使用第一行(未注释)作为标题。不是在命令中定义标题,而是从标题行中删除“#Fields:”。

#Version1.0
ID,Data
1,data1
2,data2
3,data3

然后你可以像这样创建哈希表:

$mytable = Import-Csv -Path $filePath
$HashTable=@{}
foreach($r in $mytable)
{
    $HashTable[$r.ID]=$r.Data
}

返回:

Name                           Value
----                           -----
2                              data2
1                              data1
3                              data3

答案 1 :(得分:2)

只需指定分隔符。 在你的情况下:

  

$ mytable = Import-Csv -Path $ filePath -Delimiter","

答案 2 :(得分:2)

$HashTable = @{}
Import-Csv $filePath | % { $HashTable[$_.ID] = $_.Data }

答案 3 :(得分:0)

不知道它是否“更优雅”,但是:

$mytable = Import-Csv -Path $filePath -Header ID,Data
$HashTable=@{}
foreach($r in $mytable)
{
    if ($r.ID -notlike '#*')
     {$HashTable[$r.ID]=$r.Data}
}

答案 4 :(得分:0)

你可以试试这个:

Get-Content $filePath | where {$_ -notmatch '^#'} | ConvertFrom-Csv -Header ID,Data

删除所有以#开头的行,然后将其作为CSV行读取。

答案 5 :(得分:0)

只需使用第二行作为标题:

ipcsv .\test.csv | % { $o = @{}} { $o[$_."#Fields:ID"] = $_.Data } {$o}

答案 6 :(得分:0)

在@llamb使用第一条数据行作为标题的过程中,我很幸运:

PS> $mytable = Import-CSV -Path $filePath | Group-Object -AsHashTable -Property "ID"

PS> $mytable["2"]

ID Data
-- ----
2  data2

PS> $mytable["2"].Data
data2