Necesito dividir una cadena en nuevas líneas en .NET y la única forma en que sé dividir cadenas es con el método Split . Sin embargo, eso no me permitirá dividir (fácilmente) en una nueva línea, entonces, ¿cuál es la mejor manera de hacerlo?
806
Respuestas:
Para dividir en una cadena, debe usar la sobrecarga que toma una matriz de cadenas:
Editar:
si desea manejar diferentes tipos de saltos de línea en un texto, puede usar la capacidad de hacer coincidir más de una cadena. Esto se dividirá correctamente en cualquier tipo de salto de línea y conservará las líneas vacías y el espaciado en el texto:
fuente
Environment.NewLine
propiedad contiene la nueva línea predeterminada para el sistema. Para un sistema Windows, por ejemplo, lo será"\r\n"
.\n
dejar un\r
al final de cada línea, y luego genera las líneas con un\r\n
entre ellos.\r
y\n
(entre otras) tienen un significado especial para el compilador de C #. VB no tiene esas secuencias de escape, por lo que se utilizan esas constantes en su lugar.¿Qué hay de usar un
StringReader
?fuente
while
ciclo que debe agregarse a esta respuesta.Debería poder dividir su cadena con bastante facilidad, así:
fuente
Intente evitar usar string.Split para obtener una solución general, porque usará más memoria en todos los lugares donde use la función: la cadena original y la copia dividida, ambas en la memoria. Confía en mí que esto puede ser un gran problema cuando comienzas a escalar: ejecuta una aplicación de procesamiento por lotes de 32 bits que procesa documentos de 100 MB y obtendrás ocho hilos simultáneos. No es que haya estado allí antes ...
En su lugar, use un iterador como este;
Esto le permitirá hacer un ciclo de memoria más eficiente alrededor de sus datos;
Por supuesto, si lo quieres todo en la memoria, puedes hacerlo;
fuente
blah.SplitToLines..
por ejemplodocument.SplitToLines...
?this
los parámetros formales convirtiéndolo en un método de extensión.Según la respuesta de Guffa, en una clase de extensión, use:
fuente
Para una variable de cadena
s
:Esto utiliza la definición de su entorno de terminaciones de línea. En Windows, las terminaciones de línea son CR-LF (retorno de carro, avance de línea) o en los caracteres de escape de C #
\r\n
.Esta es una solución confiable, porque si recombinas las líneas con
String.Join
, esto es igual a tu cadena original:Qué no hacer:
StringSplitOptions.RemoveEmptyEntries
, porque esto romperá el marcado, como Markdown, donde las líneas vacías tienen un propósito sintáctico.new char[]{Environment.NewLine}
, porque en Windows esto creará un elemento de cadena vacío para cada nueva línea.fuente
Regex también es una opción:
fuente
"\r?\n"
.Solo pensé que agregaría mis dos bits, porque las otras soluciones en esta pregunta no entran en la clasificación de código reutilizable y no son convenientes.
El siguiente bloque de código extiende el
string
objeto para que esté disponible como método natural cuando se trabaja con cadenas.Ahora puede usar la
.Split()
función desde cualquier cadena de la siguiente manera:Para dividir en un carácter de nueva línea, simplemente pase
"\n"
o"\r\n"
como el parámetro delimitador.Comentario: Sería bueno si Microsoft implementara esta sobrecarga.
fuente
Environment.Newline
se prefiere a la codificación rígida\n
o\r\n
.Environment.Newline
es para compatibilidad multiplataforma, no para trabajar con archivos que utilizan diferentes terminaciones de línea que el sistema operativo actual. Consulte aquí para obtener más información , por lo que realmente depende de con qué esté trabajando el desarrollador. El uso deEnvironment.Newline
asegura que no haya consistencia en el tipo de retorno de línea entre los sistemas operativos, donde la 'codificación rígida' le da al desarrollador un control total..Newline
no es mágico, debajo del capó son solo las cuerdas según lo dispuesto anteriormente en función de un interruptor de si se está ejecutando en Unix o en Windows. La apuesta más segura es hacer primero un reemplazo de cadena para todos "\ r \ n" y luego dividir en "\ n". Cuando el uso.Newline
falla, es cuando está trabajando con archivos guardados por otros programas que utilizan un método diferente para los saltos de línea. Funciona bien si sabe cada vez que la lectura del archivo siempre usa los saltos de línea de su sistema operativo actual.foo = foo.Replace("\r\n", "\n"); string[] result = foo.Split('\n');
. ¿Entiendo correctamente que esto funciona en todas las plataformas?Actualmente estoy usando esta función (basada en otras respuestas) en VB.NET:
Primero intenta dividirse en la nueva línea local de plataforma y luego recurre a cada nueva línea posible.
Solo he necesitado esto dentro de una clase hasta ahora. Si eso cambia, probablemente haré esto
Public
y lo moveré a una clase de utilidad, y tal vez incluso lo convierta en un método de extensión.Aquí le mostramos cómo volver a unir las líneas, por si acaso:
fuente
"\r"
= volver."\r\n"
= retorno + nueva línea. (revise esta publicación y la solución aceptada aquíBueno, en realidad dividir debería hacer:
fuente
La opción RemoveEmptyStrings se asegurará de que no tenga entradas vacías debido a \ n después de un \ r
(Editar para reflejar los comentarios :) Tenga en cuenta que también descartará líneas vacías genuinas en el texto. Esto suele ser lo que quiero, pero puede que no sea su requisito.
fuente
No sabía sobre Medio Ambiente. Nueva línea, pero supongo que esta es una muy buena solución.
Mi intento hubiera sido:
El .Trim adicional elimina cualquier \ r o \ n que aún pueda estar presente (por ejemplo, en Windows pero dividiendo una cadena con caracteres os x nueva línea). Sin embargo, probablemente no sea el método más rápido.
EDITAR:
Como los comentarios señalaron correctamente, esto también elimina cualquier espacio en blanco al comienzo de la línea o antes del nuevo avance de línea. Si necesita preservar ese espacio en blanco, use una de las otras opciones.
fuente
Respuesta tonta: escribe en un archivo temporal para que puedas usar el venerable
File.ReadLines
fuente
var
, ya que no define el tipo de variable, por lo que es posible que no entienda cómo usar ese objeto o qué representa ese objeto. Además, esto muestra escribir las líneas y ni siquiera especifica un nombre de archivo, por lo que dudo que funcione. Luego, al leer, la ruta al archivo nuevamente no se especifica. Suponiendo quepath
sea asíC:\Temp\test.txt
, entonces debería haberlo hechostring[] lines = File.ReadLines(path);
.Path.GetTempFileName
msdn.microsoft.com/en-us/library/… y dice que crea un archivo de cero bytes y devuelve "la ruta completa de ese archivo". Podría jurar que probé esto antes y me dio una excepción porque no encontró un archivo, sino que me devolvió una ubicación de carpeta. Conozco los argumentos para usarvar
, pero diría que NO se recomienda porque no muestra cuál es el objeto variable. Lo ofusca.fuente
Muy fácil, en realidad.
VB.NET:
C#:
fuente
Environment.NewLine
como en VB.