Gestión de archivos CSV usando C++

CSV es un formato de archivo simple que se utiliza para almacenar datos tabulares, como una hoja de cálculo o una base de datos. CSV significa valores separados por comas . Los campos de datos en un archivo CSV están separados/delimitados por una coma (‘, ‘) y las filas individuales están separadas por una nueva línea (‘\n’) . La administración de archivos CSV en C++ es similar a la administración de archivos de tipo texto, excepto por algunas modificaciones.

Este artículo trata sobre cómo crear, actualizar y eliminar registros en un archivo CSV:

Nota: Aquí, se ha creado un archivo reportcard.csv para almacenar el número de registro, el nombre y las calificaciones del estudiante en matemáticas, física, química y biología.

  1. Crear operación:

    La operación de creación es similar a la creación de un archivo de texto, es decir, ingrese datos del usuario y escríbalos en el archivo csv usando el puntero del archivo y los delimitadores apropiados (‘, ‘) entre diferentes columnas y ‘\n’ después del final de cada fila .

    CREAR

    void create()
    {
        // file pointer
        fstream fout;
      
        // opens an existing csv file or creates a new file.
        fout.open("reportcard.csv", ios::out | ios::app);
      
        cout << "Enter the details of 5 students:"
             << " roll name maths phy chem bio";
        << endl;
      
        int i, roll, phy, chem, math, bio;
        string name;
      
        // Read the input
        for (i = 0; i < 5; i++) {
      
            cin >> roll
                >> name
                >> math
                >> phy
                >> chem
                >> bio;
      
            // Insert the data to file
            fout << roll << ", "
                 << name << ", "
                 << math << ", "
                 << phy << ", "
                 << chem << ", "
                 << bio
                 << "\n";
        }
    }

    Producción:

  2. Leer un registro en particular:

    Al leer un archivo CSV, se implementa el siguiente enfoque:-

    1. Usando getline(), puntero de archivo y ‘\n’ como delimitador, lea una fila completa y guárdela en una variable de string.
    2. Usando stringstream, separe la fila en palabras.
    3. Ahora, usando getline(), el puntero stringstream y ‘, ‘ como delimitador, lea cada palabra en la fila, guárdela en una variable de string y empuje esa variable a un vector de string.
    4. Recupere los datos de una columna requerida a través de la fila [índice]. Aquí, la fila [0] siempre almacena el número de lista de un estudiante, así que compare la fila [0] con el número de lista ingresado por el usuario y, si coincide, muestre los detalles del estudiante y salga del bucle.

    Nota: aquí, dado que todos los datos que se leen del archivo se almacenan en formato de string, siempre convierta la string al tipo de datos requerido antes de comparar o calcular, etc.

    LEER

    void read_record()
    {
      
        // File pointer
        fstream fin;
      
        // Open an existing file
        fin.open("reportcard.csv", ios::in);
      
        // Get the roll number
        // of which the data is required
        int rollnum, roll2, count = 0;
        cout << "Enter the roll number "
             << "of the student to display details: ";
        cin >> rollnum;
      
        // Read the Data from the file
        // as String Vector
        vector<string> row;
        string line, word, temp;
      
        while (fin >> temp) {
      
            row.clear();
      
            // read an entire row and
            // store it in a string variable 'line'
            getline(fin, line);
      
            // used for breaking words
            stringstream s(line);
      
            // read every column data of a row and
            // store it in a string variable, 'word'
            while (getline(s, word, ', ')) {
      
                // add all the column data
                // of a row to a vector
                row.push_back(word);
            }
      
            // convert string to integer for comparision
            roll2 = stoi(row[0]);
      
            // Compare the roll number
            if (roll2 == rollnum) {
      
                // Print the found data
                count = 1;
                cout << "Details of Roll " << row[0] << " : \n";
                cout << "Name: " << row[1] << "\n";
                cout << "Maths: " << row[2] << "\n";
                cout << "Physics: " << row[3] << "\n";
                cout << "Chemistry: " << row[4] << "\n";
                cout << "Biology: " << row[5] << "\n";
                break;
            }
        }
        if (count == 0)
            cout << "Record not found\n";
    }

    Producción:

  3. Actualizar un registro:

    El siguiente enfoque se implementa al actualizar un registro: –

    1. Leer datos de un archivo y compararlos con la entrada del usuario, como se explica en la operación de lectura.
    2. Pida al usuario que ingrese nuevos valores para que se actualice el registro.
    3. actualice la fila [índice] con los nuevos datos. Aquí, el índice se refiere al campo de columna requerido que se actualizará.
    4. Escriba el registro actualizado y todos los demás registros en un archivo nuevo (‘reportcardnew.csv’).
    5. Al final de la operación, elimine el archivo anterior y cambie el nombre del archivo nuevo, con el nombre del archivo anterior, es decir, elimine ‘reportcard.csv’ y cambie el nombre de ‘reportcardnew.csv’ por ‘reportcard.csv’

    ACTUALIZAR

    void update_recode()
    {
      
        // File pointer
        fstream fin, fout;
      
        // Open an existing record
        fin.open("reportcard.csv", ios::in);
      
        // Create a new file to store updated data
        fout.open("reportcardnew.csv", ios::out);
      
        int rollnum, roll1, marks, count = 0, i;
        char sub;
        int index, new_marks;
        string line, word;
        vector<string> row;
      
        // Get the roll number from the user
        cout << "Enter the roll number "
             << "of the record to be updated: ";
        cin >> rollnum;
      
        // Get the data to be updated
        cout << "Enter the subject "
             << "to be updated(M/P/C/B): ";
        cin >> sub;
      
        // Determine the index of the subject
        // where Maths has index 2,
        // Physics has index 3, and so on
        if (sub == 'm' || sub == 'M')
            index = 2;
        else if (sub == 'p' || sub == 'P')
            index = 3;
        else if (sub == 'c' || sub == 'C')
            index = 4;
        else if (sub == 'b' || sub == 'B')
            index = 5;
        else {
            cout << "Wrong choice.Enter again\n";
            update_record();
        }
      
        // Get the new marks
        cout << "Enter new marks: ";
        cin >> new_marks;
      
        // Traverse the file
        while (!fin.eof()) {
      
            row.clear();
      
            getline(fin, line);
            stringstream s(line);
      
            while (getline(s, word, ', ')) {
                row.push_back(word);
            }
      
            roll1 = stoi(row[0]);
            int row_size = row.size();
      
            if (roll1 == rollnum) {
                count = 1;
                stringstream convert;
      
                // sending a number as a stream into output string
                convert << new_marks;
      
                // the str() converts number into string
                row[index] = convert.str();
      
                if (!fin.eof()) {
                    for (i = 0; i < row_size - 1; i++) {
      
                        // write the updated data
                        // into a new file 'reportcardnew.csv'
                        // using fout
                        fout << row[i] << ", ";
                    }
      
                    fout << row[row_size - 1] << "\n";
                }
            }
            else {
                if (!fin.eof()) {
                    for (i = 0; i < row_size - 1; i++) {
      
                        // writing other existing records
                        // into the new file using fout.
                        fout << row[i] << ", ";
                    }
      
                    // the last column data ends with a '\n'
                    fout << row[row_size - 1] << "\n";
                }
            }
            if (fin.eof())
                break;
        }
        if (count == 0)
            cout << "Record not found\n";
      
        fin.close();
        fout.close();
      
        // removing the existing file
        remove("reportcard.csv");
      
        // renaming the updated file with the existing file name
        rename("reportcardnew.csv", "reportcard.csv");
    }

    Producción:

  4. Eliminar un registro:

    El siguiente enfoque se implementa al eliminar un registro

    1. Leer datos de un archivo y compararlos con la entrada del usuario, como se explica en la operación de lectura y actualización.
    2. Escriba todos los registros actualizados, excepto los datos que se eliminarán, en un nuevo archivo (reportcardnew.csv).
    3. Elimine el archivo anterior y cambie el nombre del archivo nuevo con el nombre del archivo anterior.

    ELIMINAR

    void delete_record()
    {
      
        // Open FIle pointers
        fstream fin, fout;
      
        // Open the existing file
        fin.open("reportcard.csv", ios::in);
      
        // Create a new file to store the non-deleted data
        fout.open("reportcardnew.csv", ios::out);
      
        int rollnum, roll1, marks, count = 0, i;
        char sub;
        int index, new_marks;
        string line, word;
        vector<string> row;
      
        // Get the roll number
        // to decide the data to be deleted
        cout << "Enter the roll number "
             << "of the record to be deleted: ";
        cin >> rollnum;
      
        // Check if this record exists
        // If exists, leave it and
        // add all other data to the new file
        while (!fin.eof()) {
      
            row.clear();
            getline(fin, line);
            stringstream s(line);
      
            while (getline(s, word, ', ')) {
                row.push_back(word);
            }
      
            int row_size = row.size();
            roll1 = stoi(row[0]);
      
            // writing all records,
            // except the record to be deleted,
            // into the new file 'reportcardnew.csv'
            // using fout pointer
            if (roll1 != rollnum) {
                if (!fin.eof()) {
                    for (i = 0; i < row_size - 1; i++) {
                        fout << row[i] << ", ";
                    }
                    fout << row[row_size - 1] << "\n";
                }
            }
            else {
                count = 1;
            }
            if (fin.eof())
                break;
        }
        if (count == 1)
            cout << "Record deleted\n";
        else
            cout << "Record not found\n";
      
        // Close the pointers
        fin.close();
        fout.close();
      
        // removing the existing file
        remove("reportcard.csv");
      
        // renaming the new file with the existing file name
        rename("reportcardnew.csv", "reportcard.csv");
    }

    Producción:

Referencias: https://www.geeksforgeeks.org/file-handling-c-classes/ , https://www.geeksforgeeks.org/stringstream-c-applications/

Publicación traducida automáticamente

Artículo escrito por NAYONIKA y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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