C# 修剪所有文件中文本的最快方法

C# 修剪所有文件中文本的最快方法,c#,C#,我有一个功能来修剪目录中所有文件中的所有文本。这是密码 var dbtables = System.IO.Directory.GetFiles(db); foreach(var table in dbtables) { string text = File.ReadAllText(table); File.WriteAllText(table, text.Trim()); } 此目录中有许多大文件,大约需要30分钟才能完成。您知道一种更快的方法吗?您的代码目前会从整个文件

我有一个功能来修剪目录中所有文件中的所有文本。这是密码

var dbtables = System.IO.Directory.GetFiles(db);

foreach(var table in dbtables)
{
     string text = File.ReadAllText(table);
     File.WriteAllText(table, text.Trim());
}

此目录中有许多大文件,大约需要30分钟才能完成。您知道一种更快的方法吗?

您的代码目前会从整个文件的开头和结尾而不是每一行修剪空白。如果要按行修剪空白,可以使用:

var dbtables = System.IO.Directory.GetFiles(db);

foreach (string table in dbtables)
{
    string temp = table + ".tmp";
    using (StreamWriter target = new StreamWriter(temp))
        foreach (string line in File.ReadLines(table))
            target.WriteLine(line.Trim());

    File.Delete(table);
    File.Move(temp, table);
}

以下是我建议对每个文件执行的操作:

  • 读第一个字符

  • 如果是空白,你必须重写整个文件

  • 将整个文件读入内存
  • 从头开始逐字符迭代以查找第一个非空白字符
  • 从末尾逐字符迭代以查找第一个非空白字符
  • 查找到文件的开头
  • 只将字符串的中间字符写入文件
  • 将文件长度设置为您写入的字符数
  • 如果第一个字符不是空白,则不会修剪开头,因此可以截断结尾

  • 一个字符一个字符地向后读取文件,直到找到一个不是空白的字符
  • 如果找到了空白,请将文件长度设置为其当前长度减去空白字符数

  • 这可能比您的代码更受驱动器I/O的限制……我非常怀疑有没有更快的方法来实现这一点。为了修剪,您必须读写文件,那么您还打算如何提高性能?此外,@vcsjones也提出了一个很好的观点。获取SSD:)您应该运行一个探查器,看看时间花在哪里。这很可能发生在磁盘I/O中,不过您可以通过自己修剪文件来减少调用
    Trim()
    所花费的时间
    Trim()
    将创建一个非常大的字符串的新副本,因此保存该副本可以节省一些时间。但是请先分析一下。我想你最大的问题是你总是在写磁盘,即使
    Trim
    没有改变任何东西。您可以比较
    Trim
    的前后,看看保存文件是否有意义。
    grep()
    是最快的。你为什么想要一个C语言的程序?你是否比较了使用
    正则表达式
    C#
    的时间?如何修剪每一行并不是他的问题。老实说,我想展示一下使用惰性枚举方法的好处,比如
    ReadLines
    ,而不是将整个文件读入内存,比如OP的
    ReadAllText
    。但后来我意识到,如果事先没有读取文件,就不可能实现
    TrimEnd
    部分。