Powershell 对csv文件排序并删除指定给列的较旧行
我在“script.csv”文件中有一个csv,如下所示 我正在尝试删除一个重复的行,该行有一个旧版本。文件“script.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
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
是一个保留变量;使用不同的变量名。