2017-10-29 15 views
0

그래서 단어와 문자가 포함 된 매우 큰 txt 파일이 있습니다. 예를 들어 :C# 문자열을 txt에서 읽은 후 분할.

Hello!ReturnHowSpaceAreSpaceYouKeyOemcomma

나는에서는 StreamReader를 사용하면 내가 이런 식으로 분할하고 싶습니다 : "돌아"텍스트에 나타날 때

Hello! 
How Are You ? 

그래서, 라인에서 휴식을한다. "Space"가 빈 문자 ""로 바뀝니다. "KeyOemcomma"가 있으면 "?"로 바꿉니다.

어떻게하면됩니까? 나는 많은 옵션을 시도했지만 나를 위해 작동하지 않았다 .. :/

여기
+2

당신이 당신의 시도의 일부를 게재 할 수 있습니까? –

+0

단순한'string.Replace'가 다른 검색으로 반복되고 다른 대체물이 그것을 할 것입니다. –

+1

입력과 출력이라는 두 개의 스트림을 가질 수 있습니다. [입력 스트림] (https://msdn.microsoft.com/en-us/library/system.io.textreader (v = vs.110) .aspx)을 한 줄씩 읽은 다음 분석하여 필요한 데이터를 [출력 스트림] (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); 

:

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

나는 그것을 시험해 보았다. 그러나 "리턴"만이이 메소드로 대체되었습니다. 사실 저는 본문에서 40 단어 이상을 대체하고 싶습니다. –

+0

@Bazsi를 많이 교체하고 성능에 대한 우려가있는 것이 더 나은 접근 방법입니다. 모든 .Replace()를 40 개의 대체 루프에 하나씩 줄 것입니다. – 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.