我认为我必须遗漏一些明显的东西,因为我正在尝试使用Import-CSV导入文件顶部已注释掉行(总是以#作为第一个字符开头)的CSV文件,所以该文件如下所示:
#[SpecialCSV],,,,,,,,,,,,,,,,,,,,
#Version,1.0.0,,,,,,,,,,,,,,,,,,,
#,,,,,,,,,,,,,,,,,,,,
#,,,,,,,,,,,,,,,,,,,,
#[Table],,,,,,,,,,,,,,,,,,,,
Header1,Header2,Header3,Header4,Header5,Header6,Header7,...
Data1,Data2,Data3,Data4,Data5,Data6,Data7,...
我想忽略前5行,但仍然使用Import-csv将其余信息很好地输入到Powershell中。
由于
答案 0 :(得分:7)
简单 - 只需使用选择字符串排除带有正则表达式的注释行,然后通过管道转到 ConvertFrom-Csv :
Get-Content <path to CSV file> | Select-String '^[^#]' | ConvertFrom-Csv
Import-Csv 和 ConvertTo-Csv 之间的区别在于前者从文件中获取输入,后者接受管道输入,否则它们执行相同的操作 - 将CSV数据转换为PSCustomObjects数组。因此,通过使用 ConvertFrom-Csv ,您可以在不修改CSV文件或使用临时文件的情况下执行此操作。您可以将结果分配到数组或管道到 Foreach-Object 块,就像使用 Import-Csv 一样:
$array = Get-Content <path to CSV file> | Select-String '^[^#]' | ConvertFrom-Csv
或
Get-Content <path to CSV file> | Select-String '^[^#]' | ConvertFrom-Csv | %{
<whatever you want do with the data>
}
答案 1 :(得分:4)
CSV没有“评论”的概念 - 它只是平面数据。您需要使用Get-Content
并检查每一行。如果一行以#
开头,请忽略它,否则处理它。
如果您对使用临时文件感到满意:
Get-content special.csv |where-object{!$_.StartsWith("#")}|add-content -path $(join-path -path $env:temp -childpath "special-filtered.csv");
$mydata = import-csv -path $(join-path -path $env:temp -childpath "special-filtered.csv");
remove-item -path $(join-path -path $env:temp -childpath "special-filtered.csv")
$mydata |format-table -autosize; #Just for illustration
修改:忘记了convertfrom-csv
。这种方式变得更加简单。
$mydata = Get-Content special.csv |
Where-Object { !$_.StartsWith("#") } |
ConvertFrom-Csv
答案 2 :(得分:1)
如果将convertfrom-csv csv数据作为行数组提供,它似乎会自动过滤掉注释。我经常以这种方式使用convertfrom-csv,但是我没有看到它的记录。
cat data.csv | convertfrom-csv #skips commented lines automagically
("co1,col2,col3", "abc,def,ghi", "#this,is,a,comment", "abc1,def1,ghi1")|convertfrom-csv
co1 col2 col3
--- ---- ----
abc def ghi
abc1 def1 ghi1
但是,以下内容不会跳过注释:
"co1,col2,col3
abc,def,ghi
#this,is,a,comment
abc1,def1,ghi1
"|convertfrom-csv
co1 col2 col3
--- ---- ----
abc def ghi
#this is a
abc1 def1 ghi1