2010-04-10 10 views
6

Estaba experimentando con VB.Net File IO básico y String splitting. Encontré este problema. No sé si tiene algo que ver con el archivo IO o la división de cadenas.Problema con File IO y división de cadenas con Environment.NewLine en VB.Net

estoy escribiendo texto en un archivo como tal

Dim sWriter As New StreamWriter("Data.txt") 
sWriter.WriteLine("FirstItem") 
sWriter.WriteLine("SecondItem") 
sWriter.WriteLine("ThirdItem") 
sWriter.Close() 

Entonces, estoy leyendo el texto del archivo

Dim sReader As New StreamReader("Data.txt") 
Dim fileContents As String = sReader.ReadToEnd() 
sReader.Close() 

Ahora, estoy usando la división de fileContentsEnvironment.NewLine como delimitador.

Dim tempStr() As String = fileContents.Split(Environment.NewLine) 

Al imprimir la matriz resultante, consigo resultados un tanto extraños

For Each str As String In tempStr 
    Console.WriteLine("*" + str + "*") 
Next 

he añadido el * s al principio y al final de los elementos de matriz durante la impresión, para averiguar lo que está pasando . Como se utiliza NewLine como delimitador, esperaba que las cadenas de la matriz NO tuvieran ninguna de las líneas NewLine. Pero la salida era esto -

*FirstItem* 
* 
SecondItem* 
* 
ThirdItem* 
* 
* 

¿No debería ser esto -

*FirstItem* 
*SecondItem* 
*ThirdItem* 
** 

??

¿Por qué hay una nueva línea al principio de todas excepto la primera cadena?

Actualización: hice un carácter por carácter de impresión fileContents y conseguí este -

F - 70 
i - 105 
r - 114 
s - 115 
t - 116 
I - 73 
t - 116 
e - 101 
m - 109 
- 13 

- 10 
S - 83 
e - 101 
c - 99 
o - 111 
n - 110 
d - 100 
I - 73 
t - 116 
e - 101 
m - 109 
- 13 

- 10 
T - 84 
h - 104 
i - 105 
r - 114 
d - 100 
I - 73 
t - 116 
e - 101 
m - 109 
- 13 

- 10 

Parece 'Environment.NewLine' se compone de

- 13 

- 10 

13 y 10 .. I entender. Pero el espacio vacío en el medio? No sé si viene por imprimir en la consola o realmente es parte de NewLine.

Por lo tanto, al dividir, solo el carácter equivalente al valor ASCII 13, que es el primer carácter de NewLine, se utiliza como delimitador (como se explica en las respuestas) y el resto aún está presente en las cadenas. Por alguna razón, el misterioso espacio vacío en la lista de arriba y el valor ASCII 10 juntos dan como resultado una nueva línea que se imprime.

Ahora está claro. Gracias por la ayuda. :)

+0

El carácter 13 es un retorno de carro, 10 es un avance de línea. Es por eso que aparece como una línea en blanco en sus resultados, * porque está imprimiendo una nueva línea *. Si la respuesta a su pregunta es correcta, asegúrese de aceptarla :) –

+0

Hola ... ejem .. gracias: D: D – Senthil

Respuesta

6

En primer lugar, sí, WriteLine tachuelas en una nueva línea hasta el final de la cadena, de ahí la línea en blanco al final.

El problema es la forma en que llama al fileContents.Split(). La única versión de esa función que toma solo un argumento toma un char(), no un string. Environment.NewLine es una cadena, no char, por lo que (suponiendo que tenga Option Strict Off) cuando llama a la función implícitamente la convierte a char, utilizando solo el primer carácter de la cadena.Esto significa que en lugar de dividir la cadena en la secuencia real de dos caracteres que componen Environment.NewLine, en realidad se está dividiendo solo en el primero de esos caracteres.

para obtener su salida deseada, es necesario llamar así:

Dim delims() as String = { Environment.NewLine } 
Dim tempStr() As String = fileContents.Split(delims, _ 
          StringSplitOptions.RemoveEmptyEntries) 

Esto hará que se divide en la cadena real, más que el primer carácter como lo está haciendo ahora, y va a eliminar cualquier entrada en blanco de los resultados.

+0

Por cierto, eso no está del todo bien, solo usa el primer carácter de la cadena, dejando all \ n caracteres en las cuerdas divididas. –

+1

O simplemente vaya a la vieja escuela y use Split (fileContents, vbNewLine) –

+1

@Chris: que dejará un carácter 'CR' inútil al final de todas las cadenas. –

3

¿Por qué no usar File.ReadAllLines? Una sola llamada lee el archivo y devuelve una matriz de cadenas con las líneas.

Dim tempStr() As String = File.ReadAllLines("data.txt") 
+0

Hola, sí ... Lo usé al principio. Pero cuando ocurrió el problema, pensé que estaba haciendo el archivo IO incorrecto. Quería asegurarme de que el problema no era la manera en que estoy leyendo y escribiendo en los archivos, así que cambié a StreamReader y StreamWriter (cosas que conozco de experiencias de codificación anteriores). Olvidé volver a cambiar. Gracias por la agradable sugerencia de todos modos :) – Senthil

0

Acabo de tropezar con el mismo problema, y ​​encontré todos los comentarios muy útiles. Sin embargo, corregí mi problema al reemplazar "Environment.NewLine" con vbLF (a diferencia de vbCrLf, que tenía el mismo problema). Cualquier problema con este enfoque? (Parece más sencillo, pero no soy un programador, por lo que no sabría ningún problema potencial).

+0

Debería agregar un ejemplo – iMortalitySX