Разделить строку по длине - PullRequest
2 голосов
/ 18 июня 2009

У меня есть строковое значение длиной 5000+ символов, я хочу разделить его на 76 символов с новой строкой в ​​конце каждого из 76 символов. Как это сделать в C #?

Ответы [ 13 ]

15 голосов
/ 18 июня 2009

Если вы пишете данные Base64, попробуйте написать

Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks);

Это вставит новую строку каждые 76 символов

4 голосов
/ 18 июня 2009

Попробуйте это:

s = Regex.Replace(s, @"(?<=\G.{76})", "\r\n");

РЕДАКТИРОВАТЬ: По-видимому, это самый медленный метод из всех опубликованных до сих пор. Интересно, как это сделать, если вы предварительно скомпилируете регулярное выражение:

Regex rx0 = new Regex(@"(?<=\G.{76})");

s = rx0.Replace(s, "\r\n"); // only time this portion

Кроме того, как это можно сравнить с подходом с прямым совпадением?

Regex rx1 = new Regex(".{76}");

s = rx1.Replace(s, "$0\r\n"); // only time this portion

Мне всегда было интересно, насколько дороги эти неограниченные взгляды.

4 голосов
/ 18 июня 2009

С другой стороны, если вы хотите, чтобы производительность StringBuilder была выше производительности строки, лучше всего найти кодовый проект, найденный здесь .

alt text

(однако размер строки не отображается)

В двух словах, StringBuilder не работает быстрее, пока не будет достигнут порог с длиной строки (или многократным контактированием), который вам подходит, поэтому придерживайтесь обычной конкатенации строк и методов String.

4 голосов
/ 18 июня 2009

Немного уродливее ... но намного быстрее;) (эта версия заняла 161 такт ... Арика заняла 413)

Я разместил свой тестовый код в своем блоге. http://hackersbasement.com/?p=134 (Я также обнаружил, что StringBuilder намного медленнее, чем string.Join)

http://hackersbasement.com/?p=139 <= обновленные результаты </p>

    string chopMe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    Stopwatch sw = new Stopwatch();

    sw.Start();
    char[] chopMeArray = chopMe.ToCharArray();
    int totalLength = chopMe.Length;
    int partLength = 12;
    int partCount = (totalLength / partLength) + ((totalLength % partLength == 0) ? 0 : 1);
    int posIndex = 0;
    char[] part = new char[partLength];
    string[] parts = new string[partCount];
    int get = partLength;
    for (int i = 0; i < partCount; i++)
    {
        get = Math.Min(partLength, totalLength - posIndex);
        Array.Copy(chopMeArray, posIndex, part, 0, get);
        parts[i] = new string(part, 0, get);
        posIndex += partLength;
    }

    var output = string.Join("\r\n", parts) + "\r\n";
    sw.Stop();
    Console.WriteLine(sw.ElapsedTicks);
2 голосов
/ 18 июня 2009
public static string InsertNewLine(string s, int len)
{
    StringBuilder sb = new StringBuilder(s.Length + (int)(s.Length/len) + 1);
    int start = 0;
    for (start=0; start<s.Length-len; start+=len)
    {
        sb.Append(s.Substring(start, len));
        sb.Append(Environment.NewLine);
    }
    sb.Append(s.Substring(start));
    return sb.ToString();
}

где s будет вашей входной строкой, а len желаемой длины строки (76).

1 голос
/ 18 июня 2009
public static IEnumerable<string> SplitString(string s, int length)
{
    var buf = new char[length];
    using (var rdr = new StringReader(s))
    {
        int l;
        l = rdr.ReadBlock(buf, 0, length);
        while (l > 0)
        {
            yield return (new string(buf, 0, l)) + Environment.NewLine;
            l = rdr.ReadBlock(buf, 0, length);
        }
    }
}

Затем, чтобы собрать их вместе:

string theString = GetLongString();
StringBuilder buf = new StringBuilder(theString.Length + theString.Length/76);
foreach (string s in SplitString(theString, 76) { buf.Append(s); }
string result = buf.ToString();

Или вы можете сделать это:

string InsertNewLines(string s, int interval)
{
    char[] buf = new char[s.Length + (int)Math.Ceiling(s.Length / (double)interval)];

    using (var rdr = new StringReader(s))
    {
        for (int i=0; i<buf.Length-interval; i++)
        {
            rdr.ReadBlock(buf, i, interval);
            i+=interval;
            buf[i] = '\n';
        }
        if (i < s.Length)
        {
            rdr.ReadBlock(buf, i, s.Length - i);
            buf[buf.Length - 1] = '\n';
        }
    }
    return new string(buf);
}
1 голос
/ 18 июня 2009
string[] FixedSplit(string s, int len)
{
   List<string> output;
   while (s.Length > len)
   {
      output.Add(s.Substring(0, len) + "\n");
      s.Remove(0, len);
   }
   output.Add(s + "\n");
   return output.ToArray();
}
0 голосов
/ 16 августа 2018

@ M4N очень хороший ответ, но я думаю, while statement легче понять, чем for statement.

public static string InsertNewLine(string source, int len = 76)
{
    var sb = new StringBuilder(source.Length + (int)(source.Length / len) + 1);
    var start = 0;
    while ((start + len) < source.Length)
    {
        sb.Append(source.Substring(start, len));
        sb.Append(Environment.NewLine);
        start += len;
    }
    sb.Append(source.Substring(start));
    return sb.ToString();
}
0 голосов
/ 15 октября 2012

Я делю строку на 35

var tempstore ="12345678901234567890123456789012345";
for (int k = 0; k < tempstore.Length; k += 35)
{
   PMSIMTRequest.Append(tempstore.Substring(k, tempstore.Length - k > 35 ? 35 : tempstore.Length - k));
   PMSIMTRequest.Append(System.Environment.NewLine);
}
messagebox.Show(PMSIMTRequest.tostring());
0 голосов
/ 18 июня 2009

в основном для удовольствия, вот другое решение, реализованное как метод расширения для строки: (\ r \ n используется явно, поэтому будет поддерживать этот формат только для новой строки);

public static string Split(this string str, int len)
        {
            char org = str.ToCharArray();
            int parts = str.Length / len + (str.Length % len == 0 ? 0 : 1);
            int stepSize = len + newline.Length;
            char[] result = new char[parts * stepSize];
            int resLen = result.Length;

            for (int i =0;i<resLen ;i+stepSize)
            {
                Array.Copy(org,i*len,result,i*stepSize);
                resLen[i++] = '\r';
                resLen[i++] = '\n';
            }
            return new string(result);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...