2011-10-14 16 views
6

Supponiamo di avere una stringa con il testo: "QUESTO È UN TEST". Come potrei dividerlo ogni n caratteri? Quindi se n era 10, allora sarebbe visualizzato:C# interruzione di riga ogni n caratteri

"THIS IS A " 
"TEST" 

.. si ottiene l'idea. Il motivo è perché voglio dividere una linea molto grande in linee più piccole, un po 'come il wrap di parole. Penso di poter usare string.Split() per questo, ma non ho idea di come e sono confuso.

Qualsiasi aiuto sarebbe apprezzato.

+1

possibile duplicato del [C# Spalato una stringa in pari pezzi ciascuno di dimensione 4] (http://stackoverflow.com/questions/1450774/c-sharp-split-a-string-into-equal-chunks-each-of-size-4) –

risposta

16

Facciamo prendere in prestito un'implementazione da my answer sulla revisione del codice. Questo inserisce una linea di pausa ogni n caratteri:

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

Edit:
Per tornare un array di stringhe, invece:

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

Dovresti essere in grado di utilizzare una regex per questo. Ecco un esempio:

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

Fare riferimento a questa domanda per i dettagli:
Splitting a string into chunks of a certain size

1

Probabilmente non è il modo più ottimale, ma senza espressione regolare:

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

È meglio usare 'String.Concat()' invece di unire con una stringa vuota. –

+0

grazie per il suggerimento! – Peter

3

Forse questo può essere utilizzato per gestire in modo efficiente file di grandi dimensioni estreme:

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

In realtà, questo funziona per qualsiasi TextReader. StreamReader è il più utilizzato TextReader. È possibile gestire file di testo di grandi dimensioni (file di registro IIS, file di registro di SharePoint, ecc.) Senza dover caricare l'intero file, ma leggerlo riga per riga.

1

Tornando a questo dopo aver fatto una revisione del codice, c'è un altro modo di fare lo stesso senza l'utilizzo di 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)); 
    } 
} 
Problemi correlati