我有一个带标题行的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
答案 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