Рубрики

Управление файлами CSV с использованием C ++

CSV — это простой формат файла, используемый для хранения табличных данных, таких как электронная таблица или база данных. CSV расшифровывается как значения, разделенные запятыми . Поля данных в CSV-файле разделяются / разделяются запятой (','), а отдельные строки разделяются новой строкой ('/ n') . Управление файлами CSV в C ++ похоже на управление файлами текстового типа, за исключением нескольких модификаций.

В этой статье рассказывается о том, как создавать, обновлять и удалять записи в CSV-файле:

Примечание. Здесь был создан файл reportcard.csv для хранения номера, имени и оценок ученика по математике, физике, химии и биологии.

  1. Создать операцию:

    Операция создания аналогична созданию текстового файла, т.е. вводит данные от пользователя и записывает их в файл csv, используя указатель файла и соответствующие разделители (',') между различными столбцами и '/ n' после конца каждой строки. ,

    СОЗДАЙТЕ

    void create()

    {

        // указатель файла

        fstream fout;

      

        // открывает существующий CSV-файл или создает новый файл.

        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;

      

        // Чтение ввода

        for (i = 0; i < 5; i++) {

      

            cin >> roll

                >> name

                >> math

                >> phy

                >> chem

                >> bio;

      

            // Вставляем данные в файл

            fout << roll << ", "

                 << name << ", "

                 << math << ", "

                 << phy << ", "

                 << chem << ", "

                 << bio

                 << "\n";

        }

    }

    Выход:

  2. Прочитайте конкретную запись:

    При чтении файла CSV применяется следующий подход:

    1. Используя getline (), указатель файла и '/ n' в качестве разделителя, прочитайте всю строку и сохраните ее в строковой переменной.
    2. Используя stringstream, разделите строку на слова.
    3. Теперь, используя getline (), указатель на строковый поток и ',' в качестве разделителя, читаем каждое слово в строке, сохраняем его в строковой переменной и помещаем эту переменную в строковый вектор.
    4. Получить необходимые данные столбца через строку [индекс]. Здесь в строке [0] всегда хранится номер броска учащегося, поэтому сравните строку [0] с номером броска, введенным пользователем, и, если он совпадает, отобразите сведения о ученике и оторвитесь от цикла.

    Примечание. Здесь, поскольку все данные, считываемые из файла, хранятся в строковом формате, всегда преобразуйте строку в требуемый тип данных перед сравнением или вычислением и т. Д.

    ЧИТАТЬ

    void read_record()

    {

      

        // Указатель файла

        fstream fin;

      

        // Открыть существующий файл

        fin.open("reportcard.csv", ios::in);

      

        // Получить номер броска

        // из которых требуются данные

        int rollnum, roll2, count = 0;

        cout << "Enter the roll number "

             << "of the student to display details: ";

        cin >> rollnum;

      

        // Чтение данных из файла

        // как строковый вектор

        vector<string> row;

        string line, word, temp;

      

        while (fin >> temp) {

      

            row.clear();

      

            // читаем всю строку и

            // сохраняем его в строковой переменной 'line'

            getline(fin, line);

      

            // используется для разбиения слов

            stringstream s(line);

      

            // читаем данные каждого столбца строки и

            // сохраняем его в строковой переменной 'word'

            while (getline(s, word, ', ')) {

      

                // добавляем все данные столбца

                // строки в вектор

                row.push_back(word);

            }

      

            // преобразовать строку в целое для сравнения

            roll2 = stoi(row[0]);

      

            // Сравнить номер рулона

            if (roll2 == rollnum) {

      

                // Распечатать найденные данные

                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";

    }

    Выход:

  3. Обновить запись:

    При обновлении записи реализован следующий подход:

    1. Считайте данные из файла и сравните их с пользовательским вводом, как описано в разделе «Операция чтения».
    2. Попросите пользователя ввести новые значения для записи, которая будет обновлена.
    3. обновить строку [index] новыми данными. Здесь индекс относится к обязательному полю столбца, которое должно быть обновлено.
    4. Запишите обновленную запись и все другие записи в новый файл ('reportcardnew.csv').
    5. В конце операции удалите старый файл и переименуйте новый файл со старым именем файла, то есть удалите «reportcard.csv» и переименуйте «reportcardnew.csv» в «reportcard.csv»

    ОБНОВИТЬ

    void update_recode()

    {

      

        // Указатель файла

        fstream fin, fout;

      

        // Открыть существующую запись

        fin.open("reportcard.csv", ios::in);

      

        // Создать новый файл для хранения обновленных данных

        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;

      

        // Получить номер рулона от пользователя

        cout << "Enter the roll number "

             << "of the record to be updated: ";

        cin >> rollnum;

      

        // Получить данные для обновления

        cout << "Enter the subject "

             << "to be updated(M/P/C/B): ";

        cin >> sub;

      

        // Определяем индекс предмета

        // где математика имеет индекс 2,

        // Физика имеет индекс 3 и т. Д.

        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();

        }

      

        // Получить новые оценки

        cout << "Enter new marks: ";

        cin >> new_marks;

      

        // Обход файла

        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;

      

                // отправка числа в виде потока в выходную строку

                convert << new_marks;

      

                // str () конвертирует число в строку

                row[index] = convert.str();

      

                if (!fin.eof()) {

                    for (i = 0; i < row_size - 1; i++) {

      

                        // записываем обновленные данные

                        // в новый файл reportcardnew.csv

                        // используя fout

                        fout << row[i] << ", ";

                    }

      

                    fout << row[row_size - 1] << "\n";

                }

            }

            else {

                if (!fin.eof()) {

                    for (i = 0; i < row_size - 1; i++) {

      

                        // запись других существующих записей

                        // в новый файл, используя fout.

                        fout << row[i] << ", ";

                    }

      

                    // данные последнего столбца заканчиваются на '/ n'

                    fout << row[row_size - 1] << "\n";

                }

            }

            if (fin.eof())

                break;

        }

        if (count == 0)

            cout << "Record not found\n";

      

        fin.close();

        fout.close();

      

        // удаляем существующий файл

        remove("reportcard.csv");

      

        // переименование обновленного файла с существующим именем файла

        rename("reportcardnew.csv", "reportcard.csv");

    }

    Выход:

  4. Удалить запись:

    При удалении записи реализован следующий подход

    1. Считайте данные из файла и сравните их с пользовательским вводом, как описано в разделе операции чтения и обновления.
    2. Запишите все обновленные записи, кроме данных, которые необходимо удалить, в новый файл (reportcardnew.csv).
    3. Удалите старый файл и переименуйте новый файл, указав имя старого файла.

    УДАЛЯТЬ

    void delete_record()

    {

      

        // Открываем указатели файлов

        fstream fin, fout;

      

        // Открыть существующий файл

        fin.open("reportcard.csv", ios::in);

      

        // Создать новый файл для хранения не удаленных данных

        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;

      

        // Получить номер броска

        // определить данные для удаления

        cout << "Enter the roll number "

             << "of the record to be deleted: ";

        cin >> rollnum;

      

        // Проверяем, существует ли эта запись

        // Если существует, оставьте его и

        // добавляем все остальные данные в новый файл

        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]);

      

            // записываем все записи,

            // кроме записи, которая будет удалена,

            // в новый файл reportcardnew.csv

            // используя указатель fout

            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";

      

        // Закрыть указатели

        fin.close();

        fout.close();

      

        // удаляем существующий файл

        remove("reportcard.csv");

      

        // переименование нового файла с существующим именем файла

        rename("reportcardnew.csv", "reportcard.csv");

    }

    Выход:

Ссылки: http://espressocode.top/file-handling-c-classes/ , http://espressocode.top/stringstream-c-applications/

Рекомендуемые посты:

Управление файлами CSV с использованием C ++

0.00 (0%) 0 votes