2011-10-14 30 views
6

Załóżmy, że mam ciąg znaków z tekstem: "TO JEST TEST". Jak podzielić to co n znaków? Jeśli n wynosi 10, wyświetli:C# podział linii co n znaków

"THIS IS A " 
"TEST" 

.. masz pomysł. Powodem jest to, że chcę podzielić bardzo dużą linię na mniejsze linie, takie jak zawijanie słów. Myślę, że mogę użyć string.Split() do tego, ale nie mam pojęcia jak i jestem zdezorientowany.

Każda pomoc zostanie doceniona.

+1

możliwy duplikat [C# podzielić ciąg na równe kawałki każdej wielkości 4] (http://stackoverflow.com/questions/1450774/c-sharp-split-a-string-into-equal-chunks-each-of-size-4) –

Odpowiedz

16

Niech pożyczyć implementację od my answer na przegląd kodu. Spowoduje to wstawienie linii złamać co n znaki:

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

Edit:
Aby przywrócić tablicę ciągów Zamiast:

public static string[] SpliceText(string text, int lineLength) { 
    return Regex.Matches(text, ".{1," + lineLength + "}").Cast<Match>().Select(m => m.Value).ToArray(); 
} 
2

Powinieneś być w stanie użyć do tego celu wyrażenia regularnego. Oto przykład:

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

Patrz na to pytanie o szczegóły:
Splitting a string into chunks of a certain size

1

Prawdopodobnie nie jest to najbardziej optymalny sposób, ale bez regex:

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())); 
+0

Lepiej używać 'String.Concat()' zamiast łączenia z pusty ciąg. –

+0

dzięki za napiwek! – Peter

3

Może to służyć do obsługi wyjątkowo dużych plików:

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

W rzeczywistości działa to dla każdego TextReader. StreamReader to najczęściej używany TextReader. Możesz obsługiwać bardzo duże pliki tekstowe (pliki dzienników IIS, pliki dziennika SharePoint itp.) Bez konieczności ładowania całego pliku, ale odczytywania go wiersz po wierszu.

1

Wracając do tego po zrobieniu przeglądu kodu, istnieje inny sposób robi to samo bez użycia 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)); 
    } 
}