[英]Cut and paste line of text from text file c#
大家好,我在这里用C#编写的程序正在寻找一些建议。 我需要能够打开一个文本文档,读取文本的第一行(不是空白),将该文本行保存到另一个文本文档中,最后用空行覆盖读取的行。
到目前为止,这是我所拥有的,一切正常,直到需要在原始文本文档中写空白行的最后一部分为止,我才得到一个完整的空白文档。 就像我上面提到的,我是C#的新手,所以我敢肯定有一个简单的解决方案,但是我无法弄清楚,任何帮助都值得赞赏:
try
{
StreamReader sr = new StreamReader(@"C:\Users\Stephen\Desktop\Sample.txt");
line = sr.ReadLine();
while (line == "")
{
line = sr.ReadLine();
}
sr.Close();
string path = (@"C:\Users\Stephen\Desktop\new.txt");
if (!File.Exists(path))
{
File.Create(path).Dispose();
TextWriter tw = new StreamWriter(path);
tw.WriteLine(line);
tw.Close();
}
else if (File.Exists(path))
{
TextWriter tw = new StreamWriter(path, true);
tw.WriteLine(line);
tw.Close();
}
StreamWriter sw = new StreamWriter(@"C:\Users\Stephen\Desktop\Sample.txt");
int cnt1 = 0;
while (cnt1 < 1)
{
sw.WriteLine("");
cnt1 = 1;
}
sw.Close();
}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.Message);
}
finally
{
Console.WriteLine("Executing finally block.");
}
else
Console.WriteLine("Program Not Installed");
Console.ReadLine();
不幸的是,您必须经过艰苦的重写文件过程。 在大多数情况下,您可以避免将其加载到内存中,而只需要执行以下操作:
string contents = File.ReadAllText(oldFile);
contents = contents.Replace("bad line!", "good line!");
File.WriteAllText(newFile, contents);
请记住,由于string.Replace
并不是天生只关注整行,因此您必须在这里处理换行的想法。 但这当然是可行的。 您也可以在这种方法中使用正则表达式。 您还可以使用File.ReadAllLines(string)
将每一行读入IEnumerable<string>
并在将每一行写回到新文件时对其进行测试。 这仅取决于您要确切执行的操作以及要达到的精度。
using (var writer = new StreamWriter(newFile))
{
foreach (var line in File.ReadAllLines(oldFile))
{
if (shouldInsert(line))
writer.WriteLine(line);
}
}
当然,这取决于谓词shouldInsert
,但是您可以根据需要进行修改。 但是IEnumerable<T>
的性质应该使资源IEnumerable<T>
相对较少。 您也可以使用StreamReader
获得较低级别的支持。
using (var writer = new StreamWriter(newFile))
using (var reader = new StreamReader(oldFile))
{
string line;
while ((line = reader.ReadLine()) != null)
{
if (shouldInsert(line))
writer.WriteLine(line);
}
}
当然,请回想一下,这可能会在文件末尾留下多余的空行。 我太累了,不能肯定地说我应该能够做到,但是我很确定确实如此。 如果确实重要,请留意。 当然,通常不会。
综上所述, 最好的方法是编写一些函数以读取FileStream
并将适当的字节写到新文件中,从而在不浪费内存的情况下获得一点乐趣。 当然,这是最复杂且可能过度杀伤的方法,但这将是一项有趣的工作。
将true
添加到StreamWriter
构造函数以将其设置为“追加”模式。 请注意,这会在文档的底部添加一行,因此您可能不得不花一点时间在顶部插入或覆盖它。
并参见: 在C#中编辑文本文件的特定行
显然,仅插入或覆盖一行并不容易,通常的方法是复制所有行,同时替换所需的行并将每一行写回到文件中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.