【问题标题】:C# Read text file line by line and edit specific lineC#逐行读取文本文件并编辑特定行
【发布时间】:2017-08-30 10:31:28
【问题描述】:

我想逐行读取文本文件并编辑特定行。因此,我将文本文件放入了一个字符串变量中,例如:

string textFile = File.ReadAllText(filename);

我的文本文件是这样的:

Line A
Line B
Line C
Line abc
Line 1
Line 2
Line 3

我有一个特定的字符串 (="abc"),我想在这个 textFile 中搜索它。所以,我正在阅读这些行,直到找到字符串并在找到的字符串之后转到第三行(“第 3 行”-> 这行总是不同的):

string line = "";
string stringToSearch = "abc";

using (StringReader reader = new StringReader(textFile))
{
    while ((line = reader.ReadLine()) != null)
    {
        if (line.Contains(stringToSearch))
        {
            line = reader.ReadLine();
            line = reader.ReadLine();
            line = reader.ReadLine();

            //line should be cleared and put another string to this line.
        }
    }
}

我想清除第三个读取行并在该行添加另一个字符串并将整个string保存到textFile中。

我该怎么做?

【问题讨论】:

  • 这可能会有所帮助:File.ReadAllLines。使用这个,遍历所有行,替换你想要替换的那一行,然后写回原始文件。

标签: c# string stringreader stringwriter


【解决方案1】:

您可以像这样将内容存储在StringBuilder 中:

StringBuilder sbText = new StringBuilder();
using (var reader = new System.IO.StreamReader(textFile)) {
    while ((line = reader.ReadLine()) != null) {
        if (line.Contains(stringToSearch)) {
            //possibly better to do this in a loop
            sbText.AppendLine(reader.ReadLine());
            sbText.AppendLine(reader.ReadLine());

            sbText.AppendLine("Your Text");
            break;//I'm not really sure if you want to break out of the loop here...
        }else {
            sbText.AppendLine(line);
        }
    }
}  

然后像这样写回去:

using(var writer = new System.IO.StreamWriter(@"link\to\your\file.txt")) {
    writer.Write(sbText.ToString());
}

或者,如果您只是想将其存储在字符串 textFile 中,您可以这样做:

textFile = sbText.ToString();

【讨论】:

  • 非常感谢!这似乎是正确的做法。现在,我只有将字符串写回“textFile”字符串时出错的问题。以下行的“路径中的非法字符”:using(var writer = new System.IO.StreamWriter(textFile)) {
  • @Giovanni19:我的错误,“textFile”应该是“链接到您要写入的文本文件”。我看到您在帖子中使用了不同的变量。如果您只是想将其作为字符串存储在textFile 中,您可以使用:textFile = sbText.ToString()。我已经更新了答案。
  • 谢谢。但这是将新行添加到具有例如的行中。字符串“abc”。我想将新行添加到字符串“abc”之后的第三行。
  • @Giovanni19:我已经更新了答案。现在它应该像您希望的那样工作。 ;)
【解决方案2】:

您可能需要以下内容:

DirectoryInfo di = new DirectoryInfo(Location);
FileInfo[] rgFiles = di.GetFiles("txt File");

foreach (FileInfo fi in rgFiles)
{
    string[] alllines = File.ReadAllLines(fi.FullName);

    for (int i = 0; i < alllines.Length; i++)
    {
        if (alllines[i].Contains(stringToSearch))
        {                        
            alllines[i] = alllines[i].Replace(stringToSearch, some value );
        }
    }
}

这样您将逐行读取文本文件,直到文档结束,如果该值被拾取,它将被您的新值替换。

【讨论】:

  • 这不是我想要的:/ 请参阅我的第一篇文章。
  • @Giovanni19,您想逐行读取文档并更新一个值(如果找到),那么您想更新这个值吗?我是正确的?上面的代码可以解决这个问题....您要保存此文档的新版本吗?
【解决方案3】:

重新编写整个文件会更容易:

string old  = "abc";
string nw   = "aa";
int counter = 0;

using(StreamWriter w = new StreamWriter("newfile")
{
    foreach(string s in File.ReadLines(path))
        w.WriteLine(s == old ? nw : s);
}

【讨论】:

  • 现在 abc 行被替换,这不是 OP 想要的。还有new是关键字,不能作为变量名。
  • 另外,using 必须是小写字母,必须有大括号,而且你不能这样做 if (foo = value) 因为它不会计算为 bool(在某些语言中,比如 C++ 会改变foo 并导致奇怪的错误)。您必须改用if (foo == value)。此外,nw 是一个可怕的变量名。为什么不用newValue 或其他描述性的东西?
【解决方案4】:

这是一个完整的例子:

using System;
using System.IO;

namespace rename
{
    class Program
    {
        static void Main(string[] args)
        {
            // Fix files, replace text
            DirectoryInfo di = new DirectoryInfo(@"C:\temp\all\");
            FileInfo[] rgFiles = di.GetFiles("*");

            foreach (FileInfo fi in rgFiles)
            {
                string[] alllines = File.ReadAllLines(fi.FullName);

                for (int i = 0; i < alllines.Length; i++)
                {
                    if (alllines[i].StartsWith("00:"))
                    {
                        // Edit: Replace these lines with an empty line
                        alllines[i] = alllines[i].Replace(alllines[i], "");
                    }
                }

                // Rewrite new files in the folder
                File.WriteAllLines(@"C:\temp\new\" + fi.Name, alllines);
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2012-10-11
    • 1970-01-01
    相关资源
    最近更新 更多