排序csv文件并删除指定给列的旧行

时间:2018-12-17 08:36:45

标签: powershell csv

我在文件“ script.csv”中有一个csv

author,Revision,Path   
abc,9947,spc.sql  
xyz,9806,lmn.sql  
xyz,9810,lmn.sql  
xyz,9897,file.sql  
def,9811,test1.rdl  
def,9813,test1.rdl  

我正在尝试删除重复的行,并且版本较旧。文件“ script.csv”中的新输出应如下所示。

author,Revision,Path   
abc,9947,spc.sql  
xyz,9810,lmn.sql  
xyz,9897,file.sql  
def,9813,test1.rdl  

我尝试了下面的代码并击中

$inputFile = 'D:\script.csv'
$inputCsv = Import-Csv $inputFile | Sort-Object * -Unique

2 个答案:

答案 0 :(得分:3)

可能的解决方案是将Sort-ObjectGroup-Object组合使用

$csv = ConvertFrom-Csv "author,Revision,Path
abc,9947,spc.sql
xyz,9806,lmn.sql
xyz,9810,lmn.sql
xyz,9897,file.sql
def,9811,test1.rdl
def,9813,test1.rdl"

$csv | Sort-Object -Property author,Path,Revision -Descending | Group-Object author,Path | foreach {
    $_.Group[0]
}

输出:

author Revision Path     
------ -------- ----     
xyz    9810     lmn.sql  
xyz    9897     file.sql 
def    9813     test1.rdl
abc    9947     spc.sql 

答案 1 :(得分:0)

已经有一个可以接受的答案。我以为我会添加此内容以澄清一些小问题。

脚本:

Import-csv script.csv |
    Sort -desc author,path,revision |
    Group-Object author,path |
    foreach {$_.Group | Select -first 1 } |
    Export-csv newscript.csv -notype

输入文件:

author,Revision,Path
abc,9947,spc.sql
xyz,9806,lmn.sql
xyz,9810,lmn.sql
xyz,9897,file.sql
def,9811,test1.rdl
def,9813,test1.rdl

输出文件:

"author","Revision","Path"
"xyz","9810","lmn.sql"
"xyz","9897","file.sql"
"def","9813","test1.rdl"
"abc","9947","spc.sql"

注释:

我稍稍更改了规格,以将输出写入到与输入不同的文件中。只是这样,如果脚本执行了不幸的事情,您仍然可以输入 文件可用。那是我的习惯。您可以按照自己的方式对其进行更改。

出于我无法弄清的原因,我无法通过您发布的csv文件进行此工作。 我必须手动输入csv文件才能使其正常工作。

Export-csv中的-notype是为了防止输出文件中出现多余的行。

输出文件中的那些引号是什么?好吧,Export-csv喜欢按书做事,并用双引号将字符串引起来。可能有一种方法可以禁用它。如果您的其他软件对csv文件中的引号做出了适当的反应,则可能不会对您造成任何伤害。

是的,但是如果修订号是数字,为什么修订版会用引号引起来?好吧,Import-csv不能将其识别为数字,而是将Revision的值视为字符串。接下来是一个隐藏的问题。

哪个先出现,“ 9999”或“ 10000”。如果对它们进行数字处理,则9999位居第一。但是,如果将它们视为字符串并按字母顺序排序,则“ 10000”位于“ 9999”之前。因为在您的测试数据中,所有修订版的位数均相同,所以该问题从未浮出水面。但这在现实世界中可能并非如此。您可能必须弄清楚如何获取Import-csv才能将修订视为数字,或者在进行排序之前可能必须将修订作为数字重铸。