我创建了一个文本文件,并将数据存储到该文件中。每个词用'-'
分隔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);
}
}
答案 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)
这是最好的方法,前提是您正确地获得了fName
和lName
:
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
建议:请勿使用-作为分隔符。因为手机号码也可能包含破折号。建议您将定界符更改为逗号,。但是,名字和姓氏是您的前两个参数,不会影响您的情况。但总的来说,您想使用一个确定的分隔符,以确保它不会存在于您的值中。