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

当列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 

从上面的代码我得到的logging数,正在考虑应用循环删除logging。 例如 :

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

您正在尝试使用Excel COM对象执行此操作,但input文件似乎是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具有标题NameAddress这将只允许这些值包含数据的行。 一个非零长度的string在PowerShell中的求值为True,这就是Where可以如何利用它来简化。 您也可以将该子句读作($_.name -ne '') -and ($_.address -ne '')

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

我不认为我会为这个任务开火。 我发现Office COM应用程序有点麻烦,至less可以说。

如果您以.csv开头,为什么不使用Import-Csv创buildPowerShell数据arrays?

考虑一下。\ test.csv:

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

其中Import-Csv .\test.csv | ft -a 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 

将其分配给一个variables,然后写出一个新文件:

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