簡體   English   中英

從txt讀取后的C#字符串拆分

[英]C# String splitting after reading it from txt

因此,我有一個非常龐大的txt文件,其中包含文字和字符。 例如:

Hello!ReturnHowSpaceAreSpaceYouKeyOemcomma

當我使用流閱讀器時,我想像這樣拆分它:

Hello!
How Are You ?

因此,當“ Return”出現在文本中時,請換行。 當它說“空格”時,用一個空字符“”替換它。 如果有“ KeyOemcomma”,請將其替換為“?”。

我該怎么辦? 我嘗試了很多選擇,但對我而言不起作用..:/

使用StringBuilder替換功能。 它比string替換要快得多。

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

            Console.WriteLine(sb.ToString());

在這里查看更多信息。

這是可以執行此操作的簡單代碼塊:

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);

我的解決方案有兩個流

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);
        }
    }
}

如果這些是您想要的唯一替代品,我會同意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();

您可以在rextester上觀看現場演示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM