【问题标题】:How do I read and edit a .txt file in C#?如何在 C# 中读取和编辑 .txt 文件?
【发布时间】:2009-09-02 15:53:05
【问题描述】:

例如,我有一个 txt 文件,内容如下:

12 345 45
2342 234 45 2 2 45345
234 546 34 3 45 65 765
12 23 434 34 56 76 5

我想在所有数字之间插入一个逗号,在每行的开头添加一个左大括号,在每行的末尾添加一个右大括号。所以编辑后应该是:

{12, 345, 45}
{2342, 234, 45, 2, 2, 45345}
{234, 546, 34, 3, 45, 65, 765}
{12, 23, 434, 34, 56, 76, 5}

我该怎么做?

【问题讨论】:

    标签: c# file text-files


    【解决方案1】:

    添加了一些 LINQ 以获得乐趣和利润(优化空间;)):

    System.IO.File.WriteAllLines(
        "outfilename.txt",
        System.IO.File.ReadAllLines("infilename.txt").Select(line =>
            "{" +
            string.Join(", ",
                line.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries)
            ) + "}"
        ).ToArray()
    );
    

    【讨论】:

    • 一条语句!无与伦比:-D
    【解决方案2】:

    类似这样的东西:(未测试)

    string filename = @"c:\yourfilename.txt";
    StringBuilder result = new StringBuilder();
    
                if (System.IO.File.Exists(filename))
                {
                    using (StreamReader streamReader = new StreamReader(filename))
                    {
                        String line;
                        while ((line = streamReader.ReadLine()) != null)
                        {
                            string newLine = String.Concat("{", line, "}", Environment.NewLine);
                            newLine = newLine.Replace(" ", ", ");
                            result.Append(newLine);
                        }
                    }
                }
    
    using (FileStream fileStream = new FileStream(filename , fileMode, fileAccess))
                {
                    StreamWriter streamWriter = new StreamWriter(fileStream);
                    streamWriter.Write(result);
                    streamWriter.Close();
                    fileStream.Close();
                }
    

    【讨论】:

      【解决方案3】:

      您应该首先处理逻辑,而不是直接要求人们为您提供逻辑。至于读/写文件,你去:

      //write      
      FileStream fs = new FileStream("file_name", FileMode.Create);
      StreamWriter w = new StreamWriter(fs, Encoding.UTF8);
      w.WriteLine("text_to_write");
      w.Flush();
      w.Close();
      fs.Close();
      
      //read
      fs = new FileStream("file_name", FileMode.Open);
      StreamReader r = new StreamReader(fs, Encoding.UTF8);
      Console.WriteLine(r.ReadLine());
      r.Close();
      fs.Close();
      

      【讨论】:

      • 您应该使用 using 语句来确保对象(FileStreams、StreamReaders 和 StreamWriters 被正确处理。
      【解决方案4】:

      阅读每一行。

      在字符串之前和之后添加一个括号

      然后将空格“”替换为“,”(逗号和空格)

      【讨论】:

        【解决方案5】:
        string [] lines = File.ReadAllLines("input.txt");
        var processed = lines.Select(line => string.Format("{{{0}}}", line.Replace(" ", ", ")));
        File.WriteAllLines("output.txt",processed.ToArray());
        

        【讨论】:

          【解决方案6】:

          您需要使用FileStream 类来打开文件,使用StreamReader 类来读取文件,并使用StreamWriter 类来写回文件。

          您可以像这样创建FileStream

          FileStream file = new FileStream("FileName", FileMode.Open, FileAccess.ReadWrite);
          

          然后将FileStream 包裹在StreamReader 中:

          StreamReader reader = new StreamReader(file);
          

          然后,读入每一行并进行字符串处理(添加逗号和括号):

          while(reader.EndOfFile)
          {
             string currentLine = reader.ReadLine();
             // do your string processing here and save the result somewhere
          }
          

          最后,将FileStream 包装在StreamWriter 中,并将修改后的字符串写回文件:

          StreamWriter writer = new StreamWriter(file);
          
          // Write your content here
          writer.Write("my content");
          

          在使用它们之后不要忘记关闭你的流。

          reader.Close();
          writer.Close();
          file.Close();
          

          【讨论】:

          • 我有一个问题。当我打开同一个文件时,我必须将所有数据写回写吗?不仅仅是编辑后的数据
          【解决方案7】:

          编辑添加如何修改 sLine。 (未经测试,但我很确定它会正常工作)

              StreamReader sr = new StreamReader("path/to/file.txt");
              StreamWriter sw = new StreamWriter("path/to/outfile.txt");
              string sLine = sr.ReadLine();
              for (; sLine != null; sLine = sr.ReadLine() )
              {
                  sLine = "{" + sLine.Replace(" ", ", ") + "}";
                  sw.WriteLine(sLine);
              }
          

          【讨论】:

            【解决方案8】:
            1. 加载整个文件
            2. 使用 string.split('\n') 将内容分成几行
            3. 使用 string.replace(' ',',') 插入逗号。
            4. 保存文件。

            或者,正如 waqasahmed 所说,只需一行一行地做。

            另请参阅:http://www.csharphelp.com/archives/archive24.html

            另外,这听起来有点像家庭作业问题。也许我们应该有一个“作业”标签?

            【讨论】:

              【解决方案9】:

              最后我使用了第二个文件而不是编辑第一个文件:

              TextReader reader = new StreamReader("triangle.txt");
              TextWriter writer = new StreamWriter("triangle2.txt");
              for (; ; )
              {
                  string s = reader.ReadLine();
                  if (s == null)
                     break;
                  s = s.Replace(" ", ", ");
                  s = "{" + s + "},";
                  writer.WriteLine(s);
              }
              

              【讨论】:

              • 您应该使用如下所示的 while 循环,而不是带有中断的无限 for 循环:while(reader.Peek() > -1)
              • 我会避免无限的 for(;;) 循环;看起来风格不好。您可以将其简化为“while ((s=reader.Readline())!=null) { .... }
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多