[英]Delete rows in a csv file
我有两个文件: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 行应该被删除,因为它们都与 email 匹配。
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);
这应该工作:
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列中的任何现有电子邮件都不匹配的内容写入磁盘。 您可能需要扩展很多部分,例如几乎没有错误处理。 它还比较区分大小写的电子邮件,尽管电子邮件通常不区分大小写。
可变行不是字符串,而是字符串数组,与行相同,您以与行相同的方式读取它。
也是这条线
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);
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);
}
我知道这是 4 岁...但是我从中得到了一些想法,我喜欢分享我的解决方案...
这段代码背后的想法是一个简单的 CSV,最多大约 20 行(实际上最多),所以我决定做一些基本的东西,而不是为此使用数据库。
我的解决方案是重新扫描 CSV,将所有变量(与我想删除的变量不同)保存到一个列表中,然后在扫描 CSV 后,将列表写入ZCC8D68C551C4A9A6D5313E07DEve4DEAFDZ
List<string> _ = new();
try {
using (var reader = new StreamReader($"{Main.directory}\\bin\\ip.csv")) {
while (!reader.EndOfStream) {
var line = reader.ReadLine();
var values = line.Split(',');
if (values[0] == textBox1.Text || values[1] == textBox2.Text)
continue;
_.Add($"{values[0]},{values[1]},{values[2]},");
}
}
File.WriteAllLines($"{Main.directory}\\bin\\ip.csv", _);
} catch (Exception f) {
MessageBox.Show(f.Message);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.