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.
- 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:
- Leer un registro en particular:
Al leer un archivo CSV, se implementa el siguiente enfoque:-
- Usando getline(), puntero de archivo y ‘\n’ como delimitador, lea una fila completa y guárdela en una variable de string.
- Usando stringstream, separe la fila en palabras.
- 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.
- 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:
- Actualizar un registro:
El siguiente enfoque se implementa al actualizar un registro: –
- Leer datos de un archivo y compararlos con la entrada del usuario, como se explica en la operación de lectura.
- Pida al usuario que ingrese nuevos valores para que se actualice el registro.
- actualice la fila [índice] con los nuevos datos. Aquí, el índice se refiere al campo de columna requerido que se actualizará.
- Escriba el registro actualizado y todos los demás registros en un archivo nuevo (‘reportcardnew.csv’).
- 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:
- Eliminar un registro:
El siguiente enfoque se implementa al eliminar un registro
- Leer datos de un archivo y compararlos con la entrada del usuario, como se explica en la operación de lectura y actualización.
- Escriba todos los registros actualizados, excepto los datos que se eliminarán, en un nuevo archivo (reportcardnew.csv).
- 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/