4

我认为我一定遗漏了一些明显的东西,因为我正在尝试使用 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 中。

谢谢

4

4 回答 4

7

简单 - 只需使用Select-String排除带有正则表达式的注释行,然后通过管道传递到ConvertFrom-Csv

Get-Content <path to CSV file> | Select-String '^[^#]' | ConvertFrom-Csv

Import-CsvConvertTo-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>
}
于 2013-08-02T21:17:03.703 回答
5

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
于 2013-08-02T21:16:07.753 回答
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
于 2019-10-11T01:32:11.683 回答
1

where-object 也将在 import-csv 之后工作。您只需在子句中引用 csv 的第一列。例如:

$EscapeCharacter = '#'
$FilteredData = Import-Csv -Path "$($Home)\Documents\sample.csv" -Delimiter "`t" -Encoding UTF8 | Where-Object {$_.coll1 -notlike "$EscapeCharacter*"}

制表符分隔的 csv 示例:

coll1   coll2
#Kotehulky  SomeValue
Cakovice    OtherValue
于 2021-12-01T01:15:31.563 回答