繁体   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