Foros del Web » Programación para mayores de 30 ;) » C/C++ »

pasar archivo csv a matriz en c++

Estas en el tema de pasar archivo csv a matriz en c++ en el foro de C/C++ en Foros del Web. Hola! Para un trabajo de la universidad tengo lo siguiente: Un archivo dat (en realidad es un csv que se le ha cambiado la extension ...
  #1 (permalink)  
Antiguo 02/07/2015, 11:57
Avatar de dryant  
Fecha de Ingreso: agosto-2009
Ubicación: Malaga, Ceuta, España....
Mensajes: 283
Antigüedad: 14 años, 8 meses
Puntos: 10
pasar archivo csv a matriz en c++

Hola!

Para un trabajo de la universidad tengo lo siguiente:
Un archivo dat (en realidad es un csv que se le ha cambiado la extension a dat) con los datos asi:

1;-1;-1;344;244;-1;-1115;920;-1
2;-1;350;-1;-1; ... .... sigue y sigue

Es una matriz de adyacencia para un ejercicio de caminos minimos en DIJSKTRA.

Lo que necesito es pasar dicho archivo a una matriz dentro del programa para seguir trabajando con ella, y me esta costando ya mas de lo que me esperaba.
Yo lo que tengo es lo siguiente:
Código:
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argc, const char * argv[])
{
    string matrizAdyacencia[400];
    ifstream fmatriz;
    fmatriz.open("matrizInt.dat");  //Matriz que cada fila es: 1;-1;-1;244;... etc siendo -1 infinito.

    
    if (fmatriz.good()) {
        cout << "el fichero se ha abierto correctamente" << endl;
    }
    
    if (fmatriz.fail()) {
        cout << "ERROR abriendo el fichero" << endl;
    }
    
    int i=0;
    string texto;
    string linea;
    
    while (!fmatriz.eof()) {
        getline(fmatriz, texto, ';');
        matrizAdyacencia[i]=texto;
        cout << matrizAdyacencia[i] << "  " ;
        i++;
    }
    
    fmatriz.close();
    
    
    return 0;
}
Lo he puesto en principio como vector porque no se me ocurria como hacerlos como matriz, y aún así tampoco funciona correctamente ya que cuando llega al final de la linea, en vez de pasar a otra celda, almacena en la misma celda el ultimo digito, el salto de linea y el primer digito de la siguietne linea...

Alguna idea de como hacerlo?
Saludos y gracias!
__________________
Tecnología y tutoriales
  #2 (permalink)  
Antiguo 02/07/2015, 14:02
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: pasar archivo csv a matriz en c++

Cita:
Iniciado por dryant Ver Mensaje
Lo he puesto en principio como vector porque no se me ocurria como hacerlos como matriz
Puedes usar matrices de varias formas, te expongo dos de ellas:

Código C++:
Ver original
  1. // una matriz
  2. string matriz[num_filas][num_columnas];
  3.  
  4. // Acceder a un elemento
  5. matriz[fila][columna] = "prueba";
  6.  
  7. // Otra matriz
  8. string matriz[num_filas*num_columnas];
  9.  
  10.  
  11. // Acceder a un elemento
  12. matriz[ fila * num_filas + columna ] = "prueba";

Cita:
Iniciado por dryant Ver Mensaje
y aún así tampoco funciona correctamente ya que cuando llega al final de la linea, en vez de pasar a otra celda, almacena en la misma celda el ultimo digito, el salto de linea y el primer digito de la siguietne linea...
Eso te pasa porque tu código no distingue entre filas... el elemento 0 siempre va a ser el mismo, independientemente de que estés en la columna 3 o en la 23595.

Un saludo.
  #3 (permalink)  
Antiguo 02/07/2015, 14:03
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 10 meses
Puntos: 28
Respuesta: pasar archivo csv a matriz en c++

dryant así es porque getline lee hasta el separador (en tu caso ;) así que lee desde el último ; de la primera línea hasta el primero de la segunda quedando algo así como:

Cita:
-1\n2
Para el ejemplo que pusiste.

Quita el ; en getline (para que lea las líneas sin el ;) luego separa los datos que te quedan en el string resultante.

Saludos.
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #4 (permalink)  
Antiguo 03/07/2015, 13:58
Avatar de dryant  
Fecha de Ingreso: agosto-2009
Ubicación: Malaga, Ceuta, España....
Mensajes: 283
Antigüedad: 14 años, 8 meses
Puntos: 10
Respuesta: pasar archivo csv a matriz en c++

Cita:
Iniciado por _Lucifer_ Ver Mensaje
dryant así es porque getline lee hasta el separador (en tu caso ;) así que lee desde el último ; de la primera línea hasta el primero de la segunda quedando algo así como:



Para el ejemplo que pusiste.

Quita el ; en getline (para que lea las líneas sin el ;) luego separa los datos que te quedan en el string resultante.

Saludos.
Gracias Lucifer. Me gusta esta solución, pero se me escapa algo al implementarla...
Yo hago:
Código:
while (!fmatriz.eof()) {
        getline(fmatriz, linea);
        for (int j=0; j<18; j++) {
            getline(linea, texto,';');//Aqui está el error... "No matching function getline" ya que linea es un string y debería ser una istream.... 
            matrizAdyacencia[i][j]=texto;
            cout << matrizAdyacencia[i][j] << "  " ;
        }
        i++;
        cout << endl;

    }
getline(linea, texto,';');//Aqui está el error... "No matching function getline" ya que linea es un string y debería ser una istream....

Que diferencia hay entre uno y otro y como puedo solucionarlo?
Por lo demas... El resto deberia funcionar no?

Saludos y gracias!
__________________
Tecnología y tutoriales
  #5 (permalink)  
Antiguo 04/07/2015, 02:18
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: pasar archivo csv a matriz en c++

En ese segundo getline, efectivamente, tienes que usar un stream.

Puedes usar un stringstream, que no es más que un stream que trabaja sobre un string:

Código C++:
Ver original
  1. #include <sstream>
  2.  
  3. while (!fmatriz.eof()) {
  4.         getline(fmatriz, linea);
  5.         for (int j=0; j<18; j++) {
  6.             stringstream stream( linea );
  7.             getline(stream, texto,';');
  8.             matrizAdyacencia[i][j]=texto;
  9.             cout << matrizAdyacencia[i][j] << "  " ;
  10.         }
  11.         i++;
  12.         cout << endl;
  13.  
  14.     }

Un saludo
  #6 (permalink)  
Antiguo 04/07/2015, 04:11
Avatar de dryant  
Fecha de Ingreso: agosto-2009
Ubicación: Malaga, Ceuta, España....
Mensajes: 283
Antigüedad: 14 años, 8 meses
Puntos: 10
Respuesta: pasar archivo csv a matriz en c++

Gracias por las respuestas.
Al final he decidido hacerlo con la función strtok()
El código ahora es como sigue:
Código:
 while (!fmatriz.eof()) {
        
        getline(fmatriz, linea, '\n');      //Guardo en la variable cada linea de la matriz
        strcpy( lineaAux,linea.c_str());    //Paso la variable string linea a una variable de tipo vector de caracteres "lineaux"
        char *ptr;
        ptr = strtok(lineaAux,";");         //Divido en tokens cada vez que encuentro ";"
        while (en el token no exista el caracter "\n") {
            cout << ptr;
        }
        

    }
Pero me falta saber la forma de encontrar el caracter \n dentro del token para que en el caso de encontrarlo, poder hacer un salto de linea.
He probado con strchr, pero no lo he conseguido.

¿Como sería?

Saludos!
__________________
Tecnología y tutoriales
  #7 (permalink)  
Antiguo 04/07/2015, 11:28
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: pasar archivo csv a matriz en c++

no vas a encontrar el salto de línea... getline lee una línea completa (hasta llegar al final de la cadena o encontrar un salto de línea). Lo que almacena en el buffer que le indiques es el contenido de la línea sustituyendo el salto de línea por el caracter de final de línea.

Cuando strtok te devuelva NULL es que has procesado toda la línea.

Un saludo.
  #8 (permalink)  
Antiguo 04/07/2015, 15:00
Avatar de dryant  
Fecha de Ingreso: agosto-2009
Ubicación: Malaga, Ceuta, España....
Mensajes: 283
Antigüedad: 14 años, 8 meses
Puntos: 10
Respuesta: pasar archivo csv a matriz en c++

Eferion, muchas gracias por la respuesta!!
No había caido en ese detalle

Voy a probar a ver que tal y os digo.

Saludos!
__________________
Tecnología y tutoriales
  #9 (permalink)  
Antiguo 05/07/2015, 03:49
Avatar de dryant  
Fecha de Ingreso: agosto-2009
Ubicación: Malaga, Ceuta, España....
Mensajes: 283
Antigüedad: 14 años, 8 meses
Puntos: 10
Respuesta: pasar archivo csv a matriz en c++

Sigo sin conseguirlo....

Creo que casi lo tengo pero algo estoy haciendo mal...

Este es mi codigo:
Código:
//
//  main.cpp
//  Practica2
//
//  Created by dryant on 30/06/15.
//  Copyright (c) 2015 dryant. All rights reserved.
//

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <cstring>

using namespace std;

int main(int argc, const char * argv[])
{
    int cols=18,filas=17;
    string matrizAdyacencia[40][20];
    ifstream fmatriz;
    fmatriz.open("matrizInt.dat");
    
    if (fmatriz.good()) {
        cout << "el fichero se ha abierto correctamente" << endl;
    }
    
    if (fmatriz.fail()) {
        cout << "ERROR abriendo el fichero" << endl;
    }
    
    string texto;
    string linea;
    char lineaAux[1024] ;
    int i=0, j=0;

    
    while (!fmatriz.eof()) {
        
        getline(fmatriz, linea, '\n');      //Guardo en la variable cada linea de la matriz
        strcpy( lineaAux,linea.c_str());    //Paso la variable string linea a una variable de tipo vector de caracteres "lineaux"
        char *ptr;
        ptr = strtok(lineaAux,";");         //Divido en tokens cada vez que encuentro ";"
        while (ptr!=NULL) {
            matrizAdyacencia[i][j]=ptr;
            cout << matrizAdyacencia[i][j] << " | ";
            ptr = strtok(NULL, ";");
            j++;
        }
        
        cout << "cambio de linea \n";

        i++;    //Aumento una linea
        j=0;    //Pongo otra vez cols a 0
        

    }

//Muestro la matriz    
    for (i=0; i<filas; i++) {
        for (j=0; j<cols; j++) {
            cout << matrizAdyacencia[i][j] << " | ";
        }
        cout <<  endl;
    }
    
    fmatriz.close();
    
    
    return 0;
}
Pero me sale una matriz incompleta....
Donde c*** esta el error ahora???

Gracias!
__________________
Tecnología y tutoriales
  #10 (permalink)  
Antiguo 06/07/2015, 00:04
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: pasar archivo csv a matriz en c++

deja un enlace al dat para probar el código con un ejemplo real

Etiquetas: char, csv, funcion, int, matriz, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:04.