Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: SoyBolita en 29 Diciembre 2019, 20:16 pm



Título: Ayuda con archivo csv
Publicado por: SoyBolita en 29 Diciembre 2019, 20:16 pm
Hola a todos, verán tengo una consulta estoy realizando un pequeño programa en C++, el cual por cierto es primera vez que uso este lenguaje(soy bastante novato). bueno lo que tengo que hacer es leer un archivo .CSV y pasarlo a un DataGridView lo que he podido lograr pero es de manera "estática" es decir tengo que declarar cuantas columnas posee ese archivo, por ejemplo lo probé con 4 columnas pero no me va a resultar si el archivo csv tiene mas o menos de cuatro columnas, el problema es que no logro hacer que la lectura sea en forma dinámica y se adapte a cualquier cantidad de columnas del archivo.

Este es el código con el que hago la lectura:

Código:

ifstream in(filename);

if (in.fail()) {

MessageBox::Show("Error al abrir el archivo", "Mesaje");
}
else {

std::string campo1;
std::string campo2;
std::string campo3;
std::string campo4;

while (!in.eof()) {

getline(in, campo1, ',');
getline(in, campo2, ',');
getline(in, campo3, ',');
getline(in, campo4, '\n');

  String^ c1 = gcnew String(campo1.c_str());
  String^ c2 = gcnew String(campo2.c_str());
String^ c3 = gcnew String(campo3.c_str());
String^ c4 = gcnew String(campo4.c_str());

Importacion::dataGridVistaCSV->Columns->Add("c1", "C1");
  Importacion::dataGridVistaCSV->Columns->Add("c2", "C2");
Importacion::dataGridVistaCSV->Columns->Add("c3", "C3");
        Importacion::dataGridVistaCSV->Columns->Add("c4", "C4");

Importacion::dataGridVistaCSV->Rows->Add(c1,c2,c3,c4);

}

     }


También quisiera saber si creen que es recomendable usar visual studio para crear el programa ya que debo utilizar interfaz de usuario.

espero puedan ayudarme y desde ya muchas gracias. ;D



Título: Re: Ayuda con archivo csv
Publicado por: vangodp en 9 Enero 2020, 01:52 am
vamos suponer que hayas leído una linea de un archivo:
Código
  1. linea1 campo1,linea1 campo2,linea1 campo3,linea1 campo4,linea1 campo5

Lo que se pueda hacer(Y no digo que sea el metodo más efectivo) es una especie de strtok así como:
Código
  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4. using namespace std;
  5.  
  6. int main(){
  7.    std::string linea("linea1 campo1,linea1 campo2,linea1 campo3,linea1 campo4,linea1 campo5");
  8.    std::istringstream ss(linea);
  9.    std::string token;
  10.    int nColumnas = 0;
  11.  
  12.    while (std::getline(ss, token, ',')){
  13.        //std::cout << token << std::endl;
  14.        nColumnas++; //contador de columnas
  15.    }
  16.  
  17.    cout<< "El numero de columnas es: " << nColumnas << endl;
  18.  
  19.    return 0;
  20. }
Se puede montar una fácilmente una función y pasar una string, y que esa string le retorne el numero de columnas que tiene el tal csv.

Espero que sirva... De todos modos puedes buscar en google algo así: "Como saber el numero de columnas de un archivo csv en c++"

Suerte