当列A的值或列C的值为空时,需要删除excel文件(.CSV)的整行。
这是我到目前为止所做的:
$ab = New-Object -comobject excel.application
$bc = $ab.Workbooks.Open("C:\Users\abc\Desktop\New.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
答案 0 :(得分:6)
您目前正在尝试使用Excel COM对象执行此操作,但输入文件似乎是CSV。如果是这种情况,您不需要使用New-Object -comobject excel.application
在PowerShell中使用Import-CSV
是处理这些问题的优先方法。你没有提到文件的结构,但我们假设你有标题。如果没有,这可以稍微调整一下。
$path = "C:\Users\abc\Desktop\New.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
将编辑后的更改写回到同一文件中。
答案 1 :(得分:1)
我认为我不会为此任务启动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列的存在(确保两者都不为空):
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