[CodeSnippet] Leer archivos ANSI en .Net (cuando C# no lee la enie)

Hace meses comentábamos sobre la integración de sistemas de información, y es que cuando empiezas a interactuar con otros sistemas te das cuenta que no todos trabajan de la misma forma que tu, ni todos usan los mismos estándares. Y lo mismo pasa con la codificación de archivos.

Y parece un tema trivial, pero imaginad que estas cargando unos clientes a tu sistema que vinieron en un archivo con formato ANSI, y alguno de los clientes se apellida Nuñez. En la reuniones de análisis, nunca se determino el formato del archivo. Así que el programador abrió el archivo como siempre le ha funcionado:

   1: using (StreamReader rd = new StreamReader("rutaArchivo")) 

El archivo se cargo exitosamente al sistema, después de unas semanas al cliente le llega su recibo de facturación y su apellido no dice Nuñez, dice Nu?ez.

Seguramente responsabilizaran al programador, por programar “mal”, y bueno, en parte tiene responsabilidad por no preguntar cual era la codificación a usar. Pero también la tiene el analista o persona que no definió correctamente el contrato de servicio para intercambiar información. Se debió especificar que se iba a usar un formato en específico, o hacer que el tipo de codificación sea parametrizable.

Para leer correctamente las cadenas, debemos agregar un atributo al constructor del StreamReader/Writer. Usaremos el siguiente ejemplo, dos archivos con el mismo contenido, pero guardados en distinta codificación:

Archivos ANSI UTF8 - Geeks.ms

   1: //leyendo por defecto

   2: String fileANSI = @"....FilesEjemplo_ANSI.txt";

   3: String fileUTF8 = @"....FilesEjemplo_UTF8.txt";

   4: using (StreamReader rdDefault = new StreamReader(fileANSI))

   5: {

   6:   Console.WriteLine("Usando StreamReader Default para leer ANSI: ");

   7:   Console.Write(rdDefault.ReadToEnd());

   8:   Console.WriteLine("n----------------n");

   9: }

  10: using (StreamReader rdDefault = new StreamReader(fileUTF8))

  11: {

  12:   Console.WriteLine("Usando StreamReader Default para leer UTF8: ");

  13:   Console.Write(rdDefault.ReadToEnd());

  14:   Console.WriteLine("n----------------n");

  15: }

  16:  

  17: //leyendo en ANSI

  18: using (StreamReader rdDefault = 

  19:        new StreamReader(fileANSI, Encoding.GetEncoding(1252)))

  20: {

  21:   Console.WriteLine("Usando StreamReader ANSI para leer ANSI: ");

  22:   Console.Write(rdDefault.ReadToEnd());

  23:   Console.WriteLine("n----------------n");

  24: }

  25: using (StreamReader rdDefault = 

  26:        new StreamReader(fileUTF8, Encoding.GetEncoding(1252)))

  27: {

  28:   Console.WriteLine("Usando StreamReader ANSI para leer UTF8: ");

  29:   Console.Write(rdDefault.ReadToEnd());

  30:   Console.WriteLine("n----------------n");

  31: }     

El resultado será el siguiente:

http://sergiot2.com/blogimages/2010/04Abr/06_CSharp_StreamReader_ANSI.JPG

Descargar solución ejemplo: Leer archivos ANSI desde C#.

Otros artículos referentes a la codificación de los archivos:

Saludos,

3 comentarios en “[CodeSnippet] Leer archivos ANSI en .Net (cuando C# no lee la enie)”

  1. Hola Sergio!, otra solucion es que cuando vayas a usar el streamReader o streamWriter, primero lo asocies un FileStream con Encoding.Default.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *