2017-10-29 9 views
0

私は単語と文字を含む非常に巨大なtxtファイルを持っています。たとえば :C#文字列をtxtから読み込んだ後に分割する

Hello!ReturnHowSpaceAreSpaceYouKeyOemcomma

私はこのようにそれを分割したいStreamReaderを使用します。「戻る」のテキストで表示されたときに、行にブレークを行う

Hello! 
How Are You ? 

を。 "Space"と答えたら空の文字 ""で置き換えてください。 「KeyOemcomma」がある場合は「?」に置き換えます。

どうすればいいですか?私は多くのオプションを試してみたが、それは私のために動作しませんでした..:ここで/

+2

:あなたはあなたが交換する必要があるものの長いリストを持っている場合
はしかし、私はおそらく、このようにそれを行うだろうか? –

+0

シンプルな 'string.Replace'が異なる検索と繰り返しで繰り返されますが、どのように効率的かはわかりません。 –

+1

入力と出力の2つのストリームを持つことができます。 [入力ストリーム](https://msdn.microsoft.com/en-us/library/system.io.textreader(v = vs.110).aspx)を1行ずつ読み込んで解析し、必要なデータを[出力ストリーム](https://msdn.microsoft.com/en-us/library/system.io.textwriter(v = vs.110).aspx) –

答えて

0

はこれを行うことができ、コードの単純なブロックである。もちろん

string input = "Hello!ReturnHowSpaceAreSpaceYouKeyOemcomma";    
var textAfterReplacingReturn = input.Replace("Return", "\n"); 
var textAfterReplacingSpace = textAfterReplacingReturn.Replace("Space", " "); 
var finalText = textAfterReplacingSpace.Replace("KeyOemcomma", "?"); 
Console.WriteLine(finalText); 

、あなたは1行に置き換えますことができます:

string input = "Hello!ReturnHowSpaceAreSpaceYouKeyOemcomma";    
var resultString = input.Replace("Return", "\n").Replace("Space", " ").Replace("KeyOemcomma", "?"); 
Console.WriteLine(resultString); 
+0

ありがとうMerdigon! :) –

2

StringBuilderを使用してください。 stringよりもはるかに高速です。

string a = "Hello!ReturnHowspaceyouspacearespacedoing?"; 
      StringBuilder sb = new StringBuilder(a); 
      sb.Replace("Return", Environment.NewLine).Replace("space", " "); 

      Console.WriteLine(sb.ToString()); 

詳細はhereを確認してください。 two streams

+0

私はそれを試した。しかし、 "Return"だけがこのメソッドに置き換えられました。 実際には、本文中に40語以上の単語を置きたいと思います。 –

+0

@Bazsiの方がずっと置き換えられており、パフォーマンス上の懸念がある場合はこれがより良いアプローチです。 .Replace()を40回置き換えて1行にまとめることはできますが、 – kenny

+0

@Bazsiどういう意味ですか?私は同じコードを試して、それはリターンとスペースの両方を置き換えます。 – kakroo

0

私のソリューション:

using System; 
using System.IO; 
using System.Text; 
using System.Collections.Generic; 

class Transformer { 
    readonly StreamReader _input; 
    readonly Dictionary<string, char> _str2Char; 

    public Transformer(Stream stream, Dictionary<string, char> str2Char) { 
     _input = new StreamReader(stream); 
     _str2Char = str2Char; 

    } 
    public Stream Transfrom() { 
     var output = new StreamWriter(new MemoryStream()); 

     int c = -1; 
     // Buffer to keep read chars 
     var buffer = new StringBuilder(); 
     // Read until the end of stream (-1) 
     while ((c = _input.Read()) != -1) { 
      char ch = (char)c; 
      // We separate input stream by upper char 
      if (char.IsUpper(ch)) { 
       if (buffer.Length >= 2) { 
        var str = buffer.ToString(); 
        // We have to process "KeyOemcomma" individually 
        bool isSpecialCase = str == "Key" && ch == 'O'; 
        if (!isSpecialCase) { 
         WriteToOutput(str, output); 
         buffer.Clear(); 
        } 
        // Here should be more logic, if it was not "KeyOemcomma" 
        buffer.Append(ch); 
       } 
       else buffer.Append(ch); 
      } 
      else buffer.Append(ch); 
     } 
     if (buffer.Length > 0) { 
      WriteToOutput(buffer.ToString(), output); 
      buffer.Clear(); 
     } 
     output.Flush(); 
     return output.BaseStream; 
    } 

    void WriteToOutput(string str, StreamWriter output) { 
     // Console.WriteLine(str); 
     char c; 
     if (_str2Char.TryGetValue(str, out c)) 
      output.Write(c); 
     else 
      output.Write(str); 
    } 
} 

public class Program 
{ 
    public static void Main() 
    { 
     Dictionary<string, char> str2Char = new Dictionary<string, char> { 
      {"Return", '\n'}, 
      {"Space", ' '}, 
      {"KeyOemcomma", '?'} 
     }; 
     string str = "Hello!ReturnHowSpaceAreSpaceYouKeyOemcomma"; 
     var input = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(str)); 
     var t = new Transformer(input, str2Char); 
     var output = t.Transfrom(); 

     // Start reading output stream from the begining 
     output.Seek(0, SeekOrigin.Begin); 
     var s = new StreamReader(output); 

     int c; 
     while ((c = s.Read()) != -1) { 
      Console.Write((char)c); 
     } 
    } 
} 
0

これらは、あなたがしたいだけ交換している場合、私はkakrooの答えとなるだろう。あなたの試みのいくつかを表示することができます

string input = "Hello!ReturnHowSpaceAreSpaceYouKeyOemcomma"; 

var replacements = new List<Tuple<string,string>>() 
{ 
    Tuple.Create("Return", "\n"), 
    Tuple.Create("Space", " "), 
    Tuple.Create("KeyOemcomma", "?") //, add whatever other replacements here... 
}; 
var sb = new StringBuilder(input); 
foreach(var replacement in replacements) 
{ 
    sb.Replace(replacement.Item1, replacement.Item2); 
} 
string result = sb.ToString(); 

You can see a live demo on rextester.

関連する問題