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

时间:2015-04-24 15:13:01

标签: excel 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

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

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

2 个答案:

答案 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具有标题NameAddress,则这将只允许其中两个值都包含数据的行。在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