Un archivo CSV recibe su nombre del acrónimo Coma Separated Value y no es nada mas que eso, un archivo que separado por comas nos permite poder obtener información que es leída en modo de arreglo de elementos.
La forma mas común y fácil de poder crearlos y leerlos es mediante Excel, para esto puedes crear una hoja de cálculo cualquiera y comenzar a meter información. Ya después simplemente eliges el formato a exportar.
Para dejar bien clara esta parte, abre este archivo de Excel en tu máquina, para que veas como se ve de forma normal, puedes tener algo similar a esta imagen.
Ahora solo selecciona en el botón de Office, guardar como, y escoge el formato de Coma Separated Value.
Ya que tienes el archivo CSV simplemente vuelve a abrirlo y verás que el archivo perdió el estilo de la hoja de Excel, pero lo podrás abrir sin problema con cualquier editor de textos y tu resultado será el siguiente.
Ya que tienes el archivo de valores separados por una coma, es momento de crear tu nueva solución Silverlight y colocar un mapa y un datagrid en tu MainPage, para dejarlo de la siguiente manera.
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:bing="clr-namespace:Microsoft.Maps.MapControl;assembly=Microsoft.Maps.MapControl" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" x:Class="Leer_CSV.MainPage" Width="1024" Height="768"> <Grid x:Name="LayoutRoot" Background="White"> <bing:Map x:Name="mapa" Margin="0" Center="19.41292, -99.145" ZoomLevel="12" ScaleVisibility="Collapsed" CopyrightVisibility="Collapsed"/> <Border BorderBrush="White" BorderThickness="1" HorizontalAlignment="Right" Height="193" Margin="0,0,8,8" VerticalAlignment="Bottom" Width="450"> <Border.Effect> <DropShadowEffect/> </Border.Effect> <Border.Background> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FF5A5A5A" Offset="0"/> <GradientStop Color="#FFC4C4C4" Offset="1"/> </LinearGradientBrush> </Border.Background> <Grid Margin="0"> <sdk:DataGrid x:Name="dgDatos" Margin="8,40,8,8" AutoGenerateColumns="False"> <sdk:DataGrid.Columns> <sdk:DataGridTextColumn Header="Nombre" Width="110" Binding="{Binding Nombre}"/> <sdk:DataGridTextColumn Header="Descipción" Width="220" Binding="{Binding Descripcion}"/> <sdk:DataGridTextColumn Header="Tipo" Width="100" Binding="{Binding Tipo}"/> </sdk:DataGrid.Columns> </sdk:DataGrid> <Button x:Name="btnAbrir" Content="Abrir archivo" HorizontalAlignment="Right" Height="28" Margin="0,8,8,0" VerticalAlignment="Top" Width="109" Click="btnAbrir_Click"/> </Grid> </Border> </Grid> </UserControl> |
Recuerda que es muy importante que agregues las referencias a los ensamblados del servicio de Bing Maps. Ya con todo esto terminado, ve con la funcionalidad.
Lo primero que debes hacer es crear una clase (para fines instructivos, lo haremos en el mismo MainPage, pero como una buena práctica, es recomendable hacerlo desde un archivo por separado), que debe tener los siguientes datos.
public class Lugar { public string Nombre { get; set; } public string Descripcion { get; set; } public string Tipo { get; set; } public double Latitud { get; set; } public double Longitud { get; set; } } |
Esta será la clase que te va a servir para depositar y darle un mejor formato a tu información recibida. Después en el manejador del evento Clic del botón escribe lo siguiente.
private void btnAbrir_Click(object sender, RoutedEventArgs e) { OpenFileDialog dialogo = new OpenFileDialog(); dialogo.Multiselect = false; dialogo.Filter = "csv|*.csv"; if (dialogo.ShowDialog() == true) { try { using (StreamReader lector = dialogo.File.OpenText()) { string[] arreglo = lector.ReadToEnd().Split(','); dgDatos.ItemsSource = ProcesarInformacion(arreglo); ColocarElementosEnMapa(ProcesarInformacion(arreglo)); } } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message, "Error de Acceso al Archivo", MessageBoxButton.OK); } } } |
Aquí simplemente abres un cuadro de diálogo que filtra el tipo de archivo que usarás y con la información obtenida vas a crear un arreglo de tipo cadena, por último, como puedes ver hay dos métodos mas, uno que llena al dataGrid de información y otro que coloca elementos en el mapa. Veamos estos dos métodos.
private List<Lugar> ProcesarInformacion(string[] arregloRecibido) { List<Lugar> listaResultado = new List<Lugar>(); for (int i = 15; i + 1 < arregloRecibido.Length; i += rango) { arregloRecibido[i] = Regex.Replace(arregloRecibido[i], @"[\r\n]", ""); listaResultado.Add(new Lugar() { Nombre = arregloRecibido[i], Descripcion = arregloRecibido[i+1], Tipo = arregloRecibido[i+2], Latitud = Convert.ToDouble(arregloRecibido[i+3]), Longitud = Convert.ToDouble(arregloRecibido[i+4]) }); } return listaResultado; } |
El método que ves arriba solo va a recibir el arreglo de información y por medio de un ciclo va a popular una lista de tipo Lugar (la clase que creaste al inicio), y regresará esa lista, solo para darle un mejor formato, vas a checar que no tenga caracteres extraños con el método Replace.
private void ColocarElementosEnMapa(List<Lugar> listaLugares) { MapLayer capaMapa = new MapLayer(); foreach (Lugar elemento in listaLugares) { Pushpin marcador = new Pushpin(); Location ubicacion = new Location(); ubicacion.Latitude = elemento.Latitud; ubicacion.Longitude = elemento.Longitud; capaMapa.AddChild(marcador, ubicacion); } mapa.Children.Add(capaMapa); } |
El método que ves arriba recibirá una lista y por cada elemento de ella va a crear un nuevo pushpin que servirá para desplegar tu información, de esta manera podrás ubicar tus elementos espacialmente.
Así de sencillo puedes comenzar a utilizar archivos CSV para manejar información dentro de tus aplicaciones.
pásenme su código para hacer yo la App ayudenme