c#比较2个CSV文件,如果它存在于第二个文件中则删除

时间:2014-10-12 12:40:51

标签: c# csv

基本上我想从List.csv中删除一行,如果它存在于ListToDelete.csv中,并将结果输出到另一个名为newList.csv的文件。

List.csv
1,A,V
2,B,W
3,C,X
4,d,Y
5,E,z

ListToDelete.csv
3
4

NewList.csv
1,A,V
2,B,W
5,E,z

我理解使用streamreader和writer来读取和写入文件,但我不知道如何只存储List.csv的第一列,以便将它与ListToDelete.csv的第一列进行比较。

我最初使用split方法删除了第一列中的所有内容以进行比较,但我还需要复制其他2列,并且我无法看到如何正确比较或循环它。

string list = "List.txt";
        string listDelete = "ListToDelete.txt";
        string newList = "newList.txt";

        //2 methods to store all the text in a string array so we can match the arrays. Using ReadAllLines instead of screenreader so it populates array automatically
        var array1 = File.ReadAllLines(list);
        var array2 = File.ReadAllLines(listDelete);

        // Sets all the first columns from the CSV into an array
        var firstcolumn = array1.Select(x => x.Split(',')[0]).ToArray();
        //Matches whats in firstcolumn and array 2 to find duplicates and non duplicates
        var duplicates = Array.FindAll(firstcolumn, line => Array.Exists(array2, line2 => line2 == line));
        var noduplicates = Array.FindAll(firstcolumn, line => !Array.Exists(duplicates, line2 => line2 == line));

        //Writes all the non duplicates to a different file
        File.WriteAllLines(newList, noduplicates);  

以上代码生成
1
2
5

但我还需要将第二列和第三列写入新文件,看起来像

NewList.csv
1,A,V
2,B,W
5,E,z

1 个答案:

答案 0 :(得分:0)

你几乎做得对。问题是因为noduplicates是从firstcolumn中选择的,{1,2,3,4,5}只是第一列noduplicates。应从原始列表(array1)中选择var noduplicates = Array.FindAll(array1, line => !Array.Exists(duplicates, line2 => line.StartsWith(line2))); ,不包括以其中一个重复项开头的行。

如下所示纠正一行应解决问题。输出有3行,每行有3列。

string list = "List.csv";
string listDelete = "ListToDelete.csv";
string newList = "newList.txt";

var array1 = File.ReadAllLines(list);
var array2 = File.ReadAllLines(listDelete);

var noduplicates = Array.FindAll(array1, line => !Array.Exists(array2, line2 => line.StartsWith(line2)));

//Writes all the non duplicates to a different file
File.WriteAllLines(newList, noduplicates);

此外,您不需要解析原始数组中的第一列以进行匹配。代码可以像这样清理

{{1}}