6

我有一个带有标题行的 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 | 输出它时 输出字符串写入主机 $str

我得到以下信息:

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

如何摆脱被写入我的哈希表的标题?有没有比坚持更优雅的解决方案 if ($r.ID.StartsWith("#")) { continue; }?

谢谢!-C

4

7 回答 7

9

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
于 2015-04-01T20:53:39.147 回答
5
$HashTable = @{}
Import-Csv $filePath | % { $HashTable[$_.ID] = $_.Data }
于 2017-05-04T14:43:31.100 回答
2

你可以试试这个:

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

它在读取之前删除所有以 # 开头的行,然后作为 CSV 行。

于 2013-10-30T10:53:52.710 回答
2

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

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

于 2016-03-04T12:59:21.370 回答
1

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

$mytable = Import-Csv -Path $filePath -Header ID,Data
$HashTable=@{}
foreach($r in $mytable)
{
    if ($r.ID -notlike '#*')
     {$HashTable[$r.ID]=$r.Data}
}
于 2013-10-29T23:51:14.413 回答
1

沿着@llamb 使用第一条数据线作为标题的道路,我很幸运:

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

PS> $mytable["2"]

ID Data
-- ----
2  data2

PS> $mytable["2"].Data
data2
于 2020-05-26T23:38:29.280 回答
0

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

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

于 2015-03-14T19:13:19.340 回答