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

Powershell 对csv文件排序并删除指定给列的较旧行,powershell,csv,Powershell,Csv,我在“script.csv”文件中有一个csv,如下所示 我正在尝试删除一个重复的行,该行有一个旧版本。文件“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 $inpu

我在“script.csv”文件中有一个csv,如下所示

我正在尝试删除一个重复的行,该行有一个旧版本。文件“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

一种可能的解决方案是将
排序对象
组对象

$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 

已经有了一个公认的答案。我想我应该加上这个来澄清一些小问题

脚本:

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"
输入文件:

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"
输出文件:

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"
注意事项:

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文件才能工作

导出csv中的-notype用于防止在输出文件中出现额外的行

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

是的,但如果修订是一个数字,为什么要用引号括起来呢?导入csv没有将其识别为数字,并将修订的值视为字符串。这里有一个隐藏的问题,接下来就是


“9999”和“10000”哪个排在第一位。如果你用数字来对待它们,9999是第一位的。但如果您将它们视为字符串,并按字母顺序排序,“10000”位于“9999”之前。这个问题从未出现过,因为在测试数据中,所有的修订都有相同的位数。但在现实世界中这可能不是真的。您可能需要弄清楚如何使导入csv将修订视为一个数字,或者您可能需要在排序之前将修订重铸为数字

谢谢!但是我对powershell非常陌生,如果上面的内容在文件“script.csv”中,那么我在哪里提到文件名?我尝试了这个,但没有成功--$input=“script.csv”ConvertFrom csv-InputObject$input-Header“作者,修订,路径”我没有正确地输入要求,这是我的错,但我现在已经纠正了。@script0207使用
$csv=import csv$input-Delimiter',“
@script0207:问题是,
$input
是一个保留变量;使用不同的变量名。