2011-10-14 187 views
6

Supongamos que tengo una cadena con el texto: "ESTA ES UNA PRUEBA". ¿Cómo lo dividiría cada n caracteres? Así que si n era 10, entonces sería mostrar:salto de línea C# cada n caracteres

"THIS IS A " 
"TEST" 

.you consigue la idea. La razón es porque quiero dividir una línea muy grande en líneas más pequeñas, algo así como el ajuste de palabras. Creo que puedo usar string.Split() para esto, pero no tengo idea de cómo y estoy confundido.

Cualquier ayuda sería apreciada.

+1

posible duplicado de [C# dividir una cadena en trozos iguales, cada uno del tamaño de 4] (http://stackoverflow.com/questions/1450774/c-sharp-split-a-string-into-equal-chunks-each-of-size-4) –

Respuesta

16

Vamos a pedir prestado una aplicación de my answer en la revisión de código. Se inserta un salto de línea cada n caracteres:

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

Editar:
para devolver una matriz de cadenas en lugar:

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

Debe ser capaz de utilizar una expresión regular para esto. Aquí está un ejemplo:

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

se refieren a esta cuestión para más detalles:
Splitting a string into chunks of a certain size

1

Probablemente no sea la manera más óptima, pero sin expresión regular:

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

Es mejor usar 'String.Concat()' en lugar de unir con una cadena vacía –

+0

gracias por la sugerencia! – Peter

3

Tal vez esto se puede utilizar para manejar eficientemente archivos de gran tamaño:

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

En realidad, esto funciona para cualquier TextReader. StreamReader es el más común utilizado TextReader. Puede manejar archivos de texto muy grandes (archivos de registro de IIS, archivos de registro de SharePoint, etc.) sin tener que cargar todo el archivo, sino leerlo línea por línea.

1

Volviendo a esto después de hacer una revisión de código, hay otra forma de hacer lo mismo sin el uso de 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)); 
    } 
} 
Cuestiones relacionadas