【问题标题】:Changing lines in a txt file更改 txt 文件中的行
【发布时间】:2016-02-13 18:53:18
【问题描述】:

对 C# 有点陌生

是否可以使用 c# 更改 txt 文件中的文本?

我想打开一个包含以下内容的文本文件:

8881
8882
8883
8884
8885

将它们放在一个数组中,将行更改为:

'8881',
'8882',
'8883',
'8884',
'8885',

然后用修改后的行写出一个新的txt文件。

string[] lines = System.IO.File.ReadAllLines(@"C:\Users\Public\TestFolder\WriteLines2.txt");

//Foreach that lists all lines
System.Console.WriteLine("WriteLines2.txt contains following lines = ");
foreach (string line in lines)
{         
    Console.WriteLine(line);
}

如何才能更改每一行并将它们写入新的 txt?

【问题讨论】:

  • 您需要遍历文件的内容并修改它们。
  • changedLine = "'" + line + "'," 会将8881 转换为'8881',
  • 您正在执行此操作:打开,将所有内容读入数组,然后关闭。然后使用数组。对于大文件,它可能会非常慢,甚至由于内存不足而失败。而是打开,逐行阅读,在中间写出来然后关闭。您可以使用几百万行进行测试。
  • 题外话,如果你这样做不是为了学习,你为什么要把它变成那样的东西?闻起来像数据库操作。如果它的目的是这样,许多数据库后端会简单地读取原始文件就好了。
  • @CetinBasoz 是的,我知道对于大文件,流式读取比加载更好。我这样做是为了学习ofc。它与数据库无关。只是想学习操作文件。使用 SSMS 会非常不同,是的。我不需要任何帮助。

标签: c#


【解决方案1】:

您可以使用以下简单的 LINQ 查询和File.WriteAllLines:

var newLines = from line in System.IO.File.ReadAllLines(filePath)
               select String.Format("'{0}',", line);
System.IO.File.WriteAllLines(filePath, newLines);

【讨论】:

  • 工作就像一个魅力。我完全错过了 select String.Format 部分。谢谢!
【解决方案2】:

您可以用新行覆盖同一个文件。

String path = @"C:\Users\Public\TestFolder\WriteLines2.txt";
String[] lines = System.IO.File.ReadAllLines(path);
//I'm using System.Linq to change the lines. I'm adding a "'" before and after the original token.
String[] changedLines = lines.Select(x => string.Format("'{0}',", x)).ToArray();

// I'm saving the changes to the file.
System.IO.File.WriteAllLines(path, changedLines);

你也可以不使用 System.Linq

string[] path = @"C:\Users\Public\TestFolder\WriteLines2.txt";
string[] lines = System.IO.File.ReadAllLines(path);

// change every line
for (int index = 0; index < lines.Length; ++index)
{         
    lines[index] = string.Format("'{0}',", lines[index]);
}

System.IO.File.WriteAllLines(path, lines);

【讨论】:

  • '{0}' 应该是'{0}',
  • 谢谢!帮了我很多忙!
【解决方案3】:

你可以用 linq 试试这个

//read the fine and alter it by Select Function 
        var lines = File.ReadAllLines("file.txt").Select(item =>  string.Format("'{0}',",item)).ToArray();
    //write the lines to disk
    File.WriteAllLines("file02.txt",lines);

【讨论】:

    【解决方案4】:

    试试这个 -

    var file = File.ReadLines("path");
    var sb = new StringBuilder();
    foreach (var t in file)
    {
       if(!string.IsNullOrWhiteSpace(t))
            sb.AppendLine("'" + t + "',");
    }
    File.WriteAllLines("path", new string[] { sb.ToString() });
    

    【讨论】:

      【解决方案5】:
      var linesModified = lines.Select (l => string.Format(@"'{0}',",l));
      File.WriteAllLines(@"C:\Users\Public\TestFolder\WriteLines2_Out.txt", linesModified);
      

      编辑:使用流而不是将整个文件(可能是大文件)加载到内存中的高效版本:

      void Main()
      {
        string inFileName = @"C:\Users\Public\TestFolder\WriteLines2.txt";
        string outFileName = @"C:\Users\Public\TestFolder\WriteLines2_Out.txt";
      
        using(var r = File.OpenText(inFileName))
        using(var w = File.CreateText(outFileName))
        {
          string line;
          while ( (line = r.ReadLine()) != null)
          {
              w.WriteLine(string.Format(@"'{0}',",line));
          }
        }
      }
      

      【讨论】:

      • "File.WriteAllLines" 要求字符串数组而不是 enumberable 将显示无效参数
      • 不管怎样,你提醒我添加一个高效的版本:)
      • 天哪。我想我今天没有喝足够的咖啡。你的代码很有意义
      猜你喜欢
      • 2022-12-05
      • 1970-01-01
      • 2022-11-04
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      相关资源
      最近更新 更多