【问题标题】:How to delete lines in a CSV that start with "#" or are blank | PowerShell如何删除 CSV 中以“#”开头或空白的行 |电源外壳
【发布时间】:2019-01-15 22:35:33
【问题描述】:

我有一个包含近 4,000 多行的 CSV 文件,其中随机空白行和以“#”开头的 cmets。我正在尝试导入 CSV 文件,同时跳过空白行或以“#”开头的行。我试过这个:

$csvFile = Import-Csv .\example.csv | Where-Object {$_ -notlike '#*'} | Where-Object {$_ -ne ''}

这不起作用。我也试过:

$csvFile = Import-Csv .\example.csv
Get-Content $csvFile | Where-Object {$_ -notlike '#*' | Where-Object {$_ -ne ''} | Set-Content newCSV.csv

这两种方法都导致文件被导入所有行,并且与原始文件没有任何变化。有一个更好的方法吗?我被难住了。

【问题讨论】:

  • 正确,它是重复的。但是该线程中的任何答案都不起作用,并且没有人再响应了。
  • 您在原始问题中没有提到空行。在那里查看我的答案,它也过滤掉了空行。
  • 顺便说一句 - PowerShell 中的 OR 逻辑运算符是 -or,而不是 |。 (| 仅用于创建管道。)

标签: powershell csv import powershell-ise


【解决方案1】:

这应该可以完成工作:

Get-Content $csvPath | Where-Object { $_ -notmatch '^#|^$' } | Set-Content $strippedCsvPath

^# 匹配以# 开头的行,^$ 匹配空行。

您可以使用以下 sn-p 简化测试:

$csv = 'line1',
'#line2',
'',
'line4'

$csv | Where-Object { $_ -notmatch '^#|^$' }

如果空格(不)重要,如果空行表示仅包含空格的行,您可以将 RegEx 稍微更改为 ^\s*#|^\s*$,如下所示:

$csv = 'line1',
'#line2',
'',
'    ',
'   #comment',
'line4'

$csv | Where-Object { $_ -notmatch '^\s*#|^\s*$' }

【讨论】:

  • 您也可以考虑更新您的正则表达式以在 # 和/或纯空格行之前考虑空格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
相关资源
最近更新 更多