Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用powershell删除csv中的重复字符串_Powershell - Fatal编程技术网

使用powershell删除csv中的重复字符串

使用powershell删除csv中的重复字符串,powershell,Powershell,我有一个如下的csv文件: num1;num2;num3;num4;num5 1;2;3;4;5 5;6;7;8;9 1;2;;4;5 2;3;4;5;6 Num1是主要参数,我可以看到它有一个重复的字符串(第一个和第三个字符串)。我想删除重复的字符串3(1;2;4;5),因为num3列中有$null。如何使用powershell执行此操作 Import-CSV "C:\temp\test.csv" -Delimiter ";" | Where-Object{$_.Num3} |

我有一个如下的csv文件:

num1;num2;num3;num4;num5
1;2;3;4;5
5;6;7;8;9
1;2;;4;5
2;3;4;5;6
Num1是主要参数,我可以看到它有一个重复的字符串(第一个和第三个字符串)。我想删除重复的字符串3(1;2;4;5),因为num3列中有$null。如何使用powershell执行此操作

Import-CSV "C:\temp\test.csv" -Delimiter ";" | 
    Where-Object{$_.Num3} | 
    Sort-Object -Unique Num1 | 
    Export-Csv "C:\temp\test1.csv" -Delimiter ";" -NoTypeInformation
这将获取文件并将其作为自定义对象导入。然后,删除
Num3
为空/未填充的任何条目。使用
Sort Object
删除和复制
Num1

这样做有一些警告;不知道如何确定哪个条目是重复条目,排序可能会影响输出。此外,这将引用输出,这应该不是一件坏事

此外,此代码与数据集是冗余的,因为
Where
Sort
将删除同一行。如果数据中只包含一个条件(dup或null)的行,则此代码将对其进行筛选

不同的方法 好的,因此,毫不奇怪,上面的代码删除了您没有预料到的额外数据。最有可能的原因是,这些条件是单独评估的,就像一个或假设的那样,而这正是您所寻找的。我更改了您的测试数据以解释这些差异,以证明解决方案

此解决方案会在执行过程中重新构建数据集检查以查找重复项。如果发现
Num1
的重复项,我们将检查该记录的
Num3
是否为空

csv文件中的测试数据

num1 num2 num3 num4 num5
---- ---- ---- ---- ----
1    2    3    4    5   
5    6         8    9   
1    2         4    5   
1    2    7    4    5   
2    3    4    5    6   
所以我们可以看到,
Num1
=5,
Num3
为空,有一个
Num1
=1和
Num3
=7。这些不应被过滤掉,因为它们不能同时满足这两个要求

$scrubed=@()
$data=导入csv C:\temp\test.csv-分隔符“
$data | ForEach对象{
如果($scrubed.Num1-包含$Num1){
#我们已经进行了Num1检查,看看它是否为空
如果($\ Num3){
#Num3已填充,因此可以添加它。
$scrobed+=$_
}
}否则{
#此Num1是唯一的,应添加。
$scrobed+=$_
}
}
#输出到文件
$scrubed |导出Csv“C:\temp\test1.Csv”-分隔符“;”-非类型信息
应按如下所示将输出作为分号分隔的文件写回

num1 num2 num3 num4 num5
---- ---- ---- ---- ----
1    2    3    4    5   
5    6         8    9   
1    2    7    4    5   
2    3    4    5    6   

那么,您想删除任何具有空Num3的重复Num1值吗?是的。。。。是否删除该行是因为存在重复或空值,还是两者都有?是的,我删除该行是因为它已经存在,并且在num3中没有任何内容。sort对象是否在任何地方都查找唯一的Num1,即在Num2、num3、Num4中?它必须仅适用于Num1。这段代码现在删除了很多正确的字符串。这段代码将删除num1列中已经存在num1的行。或者如果num3为空,如何使if遵循以下行为:1)发现Num1已经存在,如果是,请检查空num3字段并将其删除?好的,问题是如何在csv的第一列中找到重复项?另一部分是通过foreach可以轻松完成的工作。@mzv请参阅我的更新。如果这不是您想要的,请更新您的样本,使其更复杂。这样我们就可以看到其他应该和不应该被过滤掉的例子。