繁体   English   中英

从文本文件C#剪切并粘贴文本行

[英]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并将适当的字节写到新文件中,从而在不浪费内存的情况下获得一点乐趣。 当然,这是最复杂且可能过度杀伤的方法,但这将是一项有趣的工作。

请参阅: 使用StreamWriter将行附加到文件

true添加到StreamWriter构造函数以将其设置为“追加”模式。 请注意,这会在文档的底部添加一行,因此您可能不得不花一点时间在顶部插入或覆盖它。

并参见: 在C#中编辑文本文件的特定行

显然,仅插入或覆盖一行并不容易,通常的方法是复制所有行,同时替换所需的行并将每一行写回到文件中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM