需要删除 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 的标题Name
和 Address
这将只允许这两个值都包含数据的行。在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