我有两个文件:Example1.csv和Example2.csv,注意它们不是用逗号分隔的,而是用' csv'保存。扩展
示例1有1列,只有电子邮件地址 示例2有许多列,其中包含示例1 csv文件中的列。
Example1.csv文件
emails
abc@gmail.com
jhg@yahoo.com
...
...
示例2.csv
Column1 column2 Column3 column4 emails
1 45 456 123 abc@gmail.com
2 89 898 254 jhg@yahoo.com
3 85 365 789 ...
现在我需要删除example2.csv中与示例1文件中的数据匹配的行,例如:当电子邮件匹配时,应删除第1行和第2行。
string[] lines = File.ReadAllLines(@"C:\example2.csv");
var emails = File.ReadAllLines(@"C:\example1.csv");
List<string> linesToWrite = new List<string>();
foreach (string s in lines)
{
String[] split = s.Split(' ');
if (s.Contains(emails))
linesToWrite.Remove(s);
}
File.WriteAllLines("file3.csv", linesToWrite);
答案 0 :(得分:2)
这应该有效:
var emails = new HashSet<string>(File.ReadAllLines(@"C:\example1.csv").Skip(1));
File.WriteAllLines("file3.csv", File.ReadAllLines("C:\example2.csv").Where(line => !emails.Contains(line.Split(',')[4]));
它读取文件一的全部内容,将所有电子邮件放入查找容易的格式,然后遍历第二个文件中的所有行,并仅将那些写入不匹配其中任何现有电子邮件的磁盘第5栏。您可能希望扩展许多部分,例如几乎没有错误处理。它还会比较电子邮件区分大小写,但通常不会发送电子邮件。
答案 1 :(得分:0)
变量行不是字符串,而是字符串数组,与行相同,您以与行相同的方式读取它。
也是这一行
if (s.Contains(line))
不正确。您正在尝试检查字符串是否包含数组。如果您需要检查一行是否包含来自列表的电子邮件,那么这将更好:
if (split.Intersect(line).Any())
所以,这是最终的代码。
var lines = File.ReadAllLines(@"C:\example2.csv");
var line = File.ReadAllLines(@"C:\example1.csv");
var linesToWrite = new List<string>();
foreach (var s in lines)
{
var split = s.Split(',');
if (split.Intersect(line).Any())
{
linesToWrite.Remove(s);
}
}
File.WriteAllLines("file3.csv", linesToWrite);
答案 2 :(得分:0)
static void Main(string[] args)
{
var Example1CsvPath = @"C:\Inetpub\Poligon\Poligon\Resources\Example1.csv";
var Example2CsvPath = @"C:\Inetpub\Poligon\Poligon\Resources\Example2.csv";
var Example3CsvPath = @"C:\Inetpub\Poligon\Poligon\Resources\Example3.csv";
var EmailsToDelete = new List<string>();
var Result = new List<string>();
foreach(var Line in System.IO.File.ReadAllLines(Example1CsvPath))
{
if (!string.IsNullOrWhiteSpace(Line) && Line.IndexOf('@') > -1)
{
EmailsToDelete.Add(Line.Trim());
}
}
foreach (var Line in System.IO.File.ReadAllLines(Example2CsvPath))
{
if (!string.IsNullOrWhiteSpace(Line))
{
var Values = Line.Split(' ');
if (!EmailsToDelete.Contains(Values[4]))
{
Result.Add(Line);
}
}
}
System.IO.File.WriteAllLines(Example3CsvPath, Result);
}