编辑 CSV 文件 - 根据条件删除整行 VIA Powershell



需要删除 excel 文件的整行 (.CSV),当 A 列的值或 C 列的值为空时。

这是我到目前为止所拥有的:

$ab = New-Object -comobject excel.application 
$bc = $ab.Workbooks.Open("C:UsersabcDesktopNew.csv")
$cd = $bc.Worksheets.Item(1)
$used = $cd.usedRange 
$lastCellCnt = $used.SpecialCells($xlCellTypeLastCell) 
$row = $lastCell.row

从上面的代码中,我得到了记录的数量,正在考虑应用循环来删除记录。例如:

if A2 == null or C2 == null then delete entire row

您当前正在尝试使用 Excel COM 对象执行此操作,但您的输入文件似乎是 CSV。如果是这种情况,则无需使用New-Object -comobject excel.application

在PowerShell中使用Import-CSV是处理这些问题的优先方法。您没有提到文件的结构,但我们假设您有标题。如果没有,可以稍微调整一下。

$path = "C:UsersabcDesktopNew.csv"
$scrubbed = Import-CSV $path | Where-Object{$_.name -and $_.address}
$scrubbed | Export-Csv -NoTypeInformation $path

假设 A 和 C 的标题NameAddress 这将只允许这两个值都包含数据的行。在PowerShell中,非零长度字符串的计算结果为True,这就是利用该Where简洁的方式。您也可以将该条款理解为($_.name -ne '') -and ($_.address -ne '')

将结果捕获到临时变量中,然后使用合作伙伴 cmdlet Export-CSV将编辑的更改写回同一文件。

我不认为我会为这项任务启动 Excel;至少可以说,我发现Office COM应用程序有点麻烦。

如果从.csv开始,为什么不使用 Import-CSV 创建数据的 PowerShell 数组?

考虑 .\test.csv:

ColumnA,ColumnB,ColumnC
1A,1B,1C
,2B,2C
3A,,3C
4A,4B,
5A,5B,5C

哪个Import-Csv .test.csv | ft -a将像这样导入:

ColumnA ColumnB ColumnC
------- ------- -------
1A      1B      1C
        2B      2C
3A              3C
4A      4B
5A      5B      5C

您可以在导入时筛选是否存在 A 列和 C 列(确保两者都不为 null):

Import-Csv .test.csv | Where-Object {$_.ColumnA -and $_.ColumnC} | ft -a
ColumnA ColumnB ColumnC
------- ------- -------
1A      1B      1C
3A              3C
5A      5B      5C

将此分配给变量,然后将其写出到新文件中:

$NewVar = Import-Csv .test.csv | Where-Object {$_.ColumnA -and $_.ColumnC}
$NewVar | Export-Csv -NoTypeInformation .newtest.csv

最新更新