C # перевод строки через каждые n символов - PullRequest
7 голосов
/ 14 октября 2011

Предположим, у меня есть строка с текстом: "ЭТО ТЕСТ". Как бы я разделил это каждые n символов? Так что, если бы n было 10, то было бы отображаться:

"THIS IS A "
"TEST"

.. вы поняли идею. Причина в том, что я хочу разбить очень большую строку на более мелкие, что-то вроде переноса слов. Я думаю, что могу использовать string.Split () для этого, но я понятия не имею, как, и я в замешательстве.

Любая помощь будет оценена.

Ответы [ 5 ]

19 голосов
/ 14 октября 2011

Давайте заимствуем реализацию из моего ответа в обзоре кода.Это вставляет разрыв строки через каждые n символов:

public static string SpliceText(string text, int lineLength) {
  return Regex.Replace(text, "(.{" + lineLength + "})", "$1" + Environment.NewLine);
}

Редактировать:
Чтобы вернуть вместо этого массив строк:

public static string[] SpliceText(string text, int lineLength) {
  return Regex.Matches(text, ".{1," + lineLength + "}").Cast<Match>().Select(m => m.Value).ToArray();
}
3 голосов
/ 14 октября 2011

Может быть, это может использоваться для эффективной обработки очень больших файлов:

public IEnumerable<string> GetChunks(this string sourceString, int chunkLength)
{  
    using(var sr = new StringReader(sourceString))
    {
        var buffer = new char[chunkLength];
        int read;
        while((read= sr.Read(buffer, 0, chunkLength)) == chunkLength)
        {
            yield return new string(buffer, 0, read);
        }        
    }
}

На самом деле это работает для любых TextReader.StreamReader является наиболее часто используемым TextReader.Вы можете обрабатывать очень большие текстовые файлы (файлы журнала IIS, файлы журнала SharePoint и т. Д.), Не загружая весь файл, а читая его построчно.

2 голосов
/ 14 октября 2011

Вы должны быть в состоянии использовать регулярное выражение для этого.Вот пример:

//in this case n = 10 - adjust as needed
List<string> groups = (from Match m in Regex.Matches(str, ".{1,10}") 
                       select m.Value).ToList();

string newString = String.Join(Environment.NewLine, lst.ToArray());

Подробности см. В этом вопросе: Разделение строки на куски определенного размера

1 голос
/ 20 июля 2015

Возвращаясь к этому после обзора кода, есть другой способ сделать то же самое без использования Regex

public static IEnumerable<string> SplitText(string text, int length)
{
    for (int i = 0; i < text.Length; i += length)
    {
        yield return text.Substring(i, Math.Min(length, text.Length - i));  
    }
}
1 голос
/ 14 октября 2011

Вероятно, не самый оптимальный способ, но без регулярных выражений:

string test = "my awesome line of text which will be split every n characters";
int nInterval = 10;
string res = String.Concat(test.Select((c, i) => i > 0 && (i % nInterval) == 0 ? c.ToString() + Environment.NewLine : c.ToString()));
...