剪切并粘贴文本文件c#中的文本行

时间:2014-07-15 09:33:12

标签: 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();

2 个答案:

答案 0 :(得分:1)

不幸的是,您必须经历重写文件的艰苦过程。在大多数情况下,您可以将其加载到内存中,然后执行以下操作:

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>的性质应该使资源相对较轻。您也可以使用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 in并获得一些乐趣并且不浪费内存写出适当的字节到你的新文件。当然,这是最复杂和可能过度杀戮的方式,但它是一项有趣的事业。

答案 1 :(得分:0)

请参阅:Append lines to a file using a StreamWriter

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

请参阅:Edit a specific Line of a Text File in C#

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