【问题标题】:How to insert a character after every n characters in a huge text file using C#? [closed]如何使用 C# 在巨大的文本文件中的每 n 个字符后插入一个字符? [关闭]
【发布时间】:2012-08-29 02:28:48
【问题描述】:

如果代码能够创建一个新文件,那就更好了。 例如:如果我的文件最初是: fsyfugiuhknklmoiuiuutyughvhjbiuhi jhiubuguygfvtdrcrsresetgfcyuhijoj

并且所需的新文件在每第三个位置后包含一个新行字符: fsy 福格 呃 结 ...

代码应该是什么?

【问题讨论】:

  • 访问每个字符 if(currentIndex % n == 0) { //code to insert character } 这是 O(N)。

标签: c# file insert


【解决方案1】:
void InsertACharacterNoStringAfterEveryNCharactersInAHugeTextFileUsingCSharp(
    string inputPath, string outputPath, int blockSize, string separator)
{
    using (var input = File.OpenText(inputPath))
    using (var output = File.CreateText(outputPath))
    {
        var buffer = new char[blockSize];
        int readCount;
        while ((readCount = input.ReadBlock(buffer, 0, buffer.Length)) > 0)
        {
            output.Write(buffer, 0, readCount);
            if (readCount == buffer.Length)
                output.Write(separator);
        }
    }
}

// usage:
InsertACharacterNoStringAfterEveryNCharactersInAHugeTextFileUsingCSharp(
    inputPath, outputPath, 3, Environment.NewLine);

【讨论】:

  • 这看起来真的很有效。代码很短,功能是动态的。
【解决方案2】:

这可能会对你有所帮助(我已经提供了在每 n 个字符之后插入字符的基本逻辑......)

static void Main(string[] args)
        {
            var input = "fsyfugiuhknklmoiuiuutyughvhjbiuhi jhiubuguygfvtdrcrsresetgfcyuhijoj".ToCharArray();
            var elementsToConsider = 3;
            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < input.Length; i++)
            {
                sb.AppendLine(input.Skip(i).Take(elementsToConsider).Aggregate("",(a, b) => a + b));
                i = i + (elementsToConsider  -1);
            }
            Console.WriteLine(sb.ToString());
            Console.ReadKey();
        }

【讨论】:

    【解决方案3】:

    嗯……

    public string Tweak( string s , char c , int n )
    {
      StringBuilder sb = new StringBuilder( s.Length + ( s.Length % n ) + 1 ) ;
      for ( int i = 0 ; i < s.Length ; ++i )
      {
        sb.Append( s[i] ) ;
        if ( i % n == 0 ) sb.Append( c ) ;
      }
      return sb.ToString() ;
    }
    

    这可能和你得到的一样好。尽管使用 char 数组 (char[]) 和使用类 System.Buffer 的方法 BlockCopy 并通过 new String( outputBuffer ) 实例化新字符串的数组块复制操作可能会获得更好的性能。结果字符串的长度是源字符串的长度 L 加上 L % n,其中 n 是周期长度。如果末尾的最后一个 [也可能是短的] 段应添加尾随字符,则将输出缓冲区的长度加 1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-13
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多