我昨天在SO上发布了这个,我收到了一个很好的答案,但我需要改变它,我不知道如何。
这是我的original question:
我需要从文本文件中删除最后一行。我知道如何在C#中打开和保存文本文件,但是如何删除文本文件的最后一行?
文本文件的大小总是不同(有些有80行,有些有20行)。
怎么做?
以下是有人给我做的代码(工作正常)
//Delete the last line from the file. This line could be 8174, 10000, or anything. This is from SO
string tempfile = @"C:\junk_temp.txt";
using (StreamReader reader2 = new StreamReader(newfilename))
{
using (StreamWriter writer2 = new StreamWriter(tempfile))
{
string line = reader2.ReadLine();
while (!reader2.EndOfStream)
{
writer2.WriteLine(line);
line = reader2.ReadLine();
} // by reading ahead, will not write last line to file
}
}
File.Delete(newfilename);
File.Move(tempfile, newfilename);
File.Delete(tempfile);
如果是4位或5位数字符串(例如8001或99999),我如何将其更改为仅删除文本文件的最后一行。
如果它不是那个,比如%,那么我不想删除最后一行。
有人可以修改上面的代码来为我做这个吗?
答案 0 :(得分:3)
要保持与当前代码中相同的逻辑,您可以执行以下操作
//Delete the last line from the file. This line could be 8174, 10000, or anything. This is from SO
string tempfile = @"C:\junk_temp.txt";
using (StreamReader reader2 = new StreamReader(newfilename))
{
using (StreamWriter writer2 = new StreamWriter(tempfile))
{
string line = reader2.ReadLine();
while (!reader2.EndOfStream)
{
writer2.WriteLine(line);
line = reader2.ReadLine();
} // by reading ahead, will not write last line to file
// If the last line read does not match your condition
// we write it to the new file
if (!Regex.IsMatch(line, @"^\d{4,5}$"))
{
writer2.WriteLine(line);
}
}
}
File.Delete(newfilename);
File.Move(tempfile, newfilename);
File.Delete(tempfile);
答案 1 :(得分:0)
你必须在
之后进行有条件的检查line = reader2.ReadLine();
检查EndOfStream,如果这是真的,则对该行进行条件检查(RegEx或line.Length == 5)。
答案 2 :(得分:0)
创建一个与4位或5位数字符串匹配的RegEx,并过滤掉您的行删除。 C#RegEx练习/学习在网上有很多好的网站。
答案 3 :(得分:0)
在while
循环结束后添加:
if (!Regex.IsMatch(line, @"^\d{4,5}$"))
writer2.WriteLine(line);
答案 4 :(得分:0)
将您的while
更改为:
while (!reader2.EndOfStream)
{
string line = reader2.ReadLine();
if (reader2.EndOfStream && (CheckIfNeedToDeleteLine(line) == false))
{
writer2.WriteLine(line);
}
}
您需要实施CheckIfNeedToDeleteLine(line)
。
bool CheckIfNeedToDeleteLine(string line)
{
int digit = 0;
return (((line.Length == 4) || (line.Length == 5)) &&
(int.TryParse(line, out digit)))
}
Regex
CheckIfNeedToDeleteLine
的实施:
bool CheckIfNeedToDeleteLine(string line)
{
return Regex.IsMatch(line, @"^\d{4,5}$");
}
不知道哪个更有效但是它并不重要,因为它只会发生在最后一次迭代中,因为if
语句的顺序。
答案 5 :(得分:0)
我不愿意直接“修改代码”,但我会给你一个指针。
string line = reader2.ReadLine();
while (!reader2.EndOfStream)
{
writer2.WriteLine(line);
line = reader2.ReadLine();
} // by reading ahead, will not write last line to file
在此代码中的最后一个大括号}
之后,您在变量line
中拥有该文件的最后一行。在您当前的代码中,此行被丢弃。我建议你在这里插入一个“if”语句,将最后一行与你的标准进行比较。你可以使用正则表达式,^[0-9]{4,5}$
之类的东西应该是合适的。
如果符合条件,只需再次拨打writer2.WriteLine(line);
最后一行。
答案 6 :(得分:-1)
string tempfile = @"C:\junk_temp.txt";
using (StreamReader reader2 = new StreamReader(newfilename))
{
using (StreamWriter writer2 = new StreamWriter(tempfile))
{
string line = reader2.ReadLine();
while (!reader2.EndOfStream)
{
writer2.WriteLine(line);
line = reader2.ReadLine();
} // by reading ahead, will not write last line to file
int result=0;
if (Int32.TryParse(s, out result) )
{
if (s.Length != 4 || s.Length != 5)
writer2.WriteLine(line);
}
}
}
File.Delete(newfilename);
File.Move(tempfile, newfilename);
File.Delete(tempfile);