删除csv文件中的行

时间:2018-02-23 16:09:47

标签: c#

我有两个文件: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);

3 个答案:

答案 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);

    }