编辑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具有标题Name
和Address
这将只允许这些值包含数据的行。 一个非零长度的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