如果行中存在任何特定或更多单词,如何从文本文件中删除整行

时间:2018-08-10 20:43:59

标签: c# winforms

我创建了一个文本文件,并将数据存储到该文件中。每个词用'-'

分隔
  

word1-word2-word3-word4。

此外,我正在使用DataGridView(control)在单独的列中显示每个单词。

我想从文本文件中删除特定行,让我们说“ word1”和“ word2”与给定变量匹配

  

公共静态字符串word1;     公共静态字符串word2;`

我正在尝试实现以下代码,但没有得到适当的解决方案来做到这一点。请帮忙。我是C#的新手...

 public static string word1; //static to access in another form
 public static string word2;
 if (e.ColumnIndex == 5) //view
 {
     string[] lines = File.ReadAllLines(@"info.txt");

     word1 = dataGridViewF.Rows[e.RowIndex].Cells[0].Value.ToString();
     word2= dataGridViewF.Rows[e.RowIndex].Cells[1].Value.ToString();

     string[] newLines = lines.Where(line => !line.Contains(word1));

     using (StreamWriter file = new StreamWriter(@"info.txt", true))
     {
         File.WriteAllLines(@"info.txt"", newLines);
     }
 }

2 个答案:

答案 0 :(得分:2)

您的示例文字行:

FirstName-LastName-age-MobileNo.

是一个很重要的指标,表明您可能使用了错误的方法。如果-界定了您的数据,那么当电话号码中包含-时会怎样?当一个已婚的好朋友的新姓氏有一个-时,会发生什么?您能看到这有什么问题吗?

一种更好的方法(如注释中所述)是将您的数据序列化为为此目的而设计的格式。我将在示例中使用Json。

首先,您应该创建一个描述您的数据的类:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string MobilePhoneNumber { get; set; }
    public int Age { get; set; } //Really should be storing birthday instead...
}

当您将此对象序列化为json时,它将看起来像这样:

{
    "FirstName": "John",
    "LastName": "Doe",
    "Age": 42,
    "MobilePhoneNumber": "(123) 456-7890"
}

这些列表如下所示:

[{
    "FirstName": "John",
    "LastName": "Doe",
    "Age": 42,
    "MobilePhoneNumber": "(123) 456-7890"
},
{
    "FirstName": "Jane",
    "LastName": "Sanders-Doe",
    "Age": 69,
    "MobilePhoneNumber": "(890) 555-1234"
}]

因此,现在您获取此数据的代码非常简单(我将使用Json.NET-此功能的标准库):

string json = File.ReadAllText(@"info.json");
List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(json);

现在您可以使用实际的对象了,您的代码将更加整洁并且不易出错:

string fName = dataGridViewF.Rows[e.RowIndex].Cells[0].Value.ToString();
string lName = dataGridViewF.Rows[e.RowIndex].Cells[1].Value.ToString();

string json = File.ReadAllText("info.json");

//'deserializes' which just means turns JSON into a real object
List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(json);

//'persons' is now a list of Persons who's names DONT match
//in other words the names that matched are removed from the output
persons = persons.Where(x => x.FirstName != fName && x.LastName != lName).ToList();

//'serialize' means turns an object into a json string
json = JsonConvert.SerializeObject(persons);

File.WriteAllText("info.json", json);

请注意,我使代码有些冗长,因此您可以理解。上面的许多行可以压缩为更少的行。

答案 1 :(得分:1)

这是最好的方法,前提是您正确地获得了fNamelName

string[] lines = File.ReadAllLines(@"info.txt"); //original file

fName = dataGridViewF.Rows[e.RowIndex].Cells[0].Value.ToString();
lName = dataGridViewF.Rows[e.RowIndex].Cells[1].Value.ToString();

var iter = lines.Where(line => {
    string[] name = line.Split('-');
    string f = name[0];
    string l = name[1];
    if(f.ToLower().Equals(fName.ToLower()))
        if (l.ToLower().Equals(lName.ToLower()))
        {
            return false;
        }
    return true;
});

File.WriteAllLines(@"D:\\newfile.txt", iter.ToArray()); //put them in newfile.txt, don't delete the original one which is info.txt

建议:请勿使用-作为分隔符。因为手机号码也可能包含破折号。建议您将定界符更改为逗号。但是,名字和姓氏是您的前两个参数,不会影响您的情况。但总的来说,您想使用一个确定的分隔符,以确保它不会存在于您的值中。