基本上我想从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
答案 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}}