wczytanie linii z csv do tablicy[i][j]

0

chciałem prosić kogoś o pomoc w opracowaniu kawałka kodu. Zadanie do szkoły, mam plik csv o treści:
"
1, Publiczny, 2020/01/02, 2020/01/03, 2020/01/03
2, NiePubliczy, 2020/01/03, 2020/01/04, 2020/01/03
"
1, 2 to numery klienta. Muszę sprawdzić czy w pliku nie występuje nr 1 więcej niż 2 razy i wyświetlić te linie gdzie występuje 1

mam coś takiego, ale nie chce mi działać:

int i = 0, j = 0;
string baza_filmow[10][10];
ifstream filmy("wypozycz.csv");
if (filmy.good())
{
// cout << "ok" << endl;
while (!filmy.eof())
{
getline(filmy, baza_filmow[i][0], ';');
getline(filmy, baza_filmow[i][1], ';');
getline(filmy, baza_filmow[i][2], ';');
getline(filmy, baza_filmow[i][3], ';');
getline(filmy, baza_filmow[i][4], ';');
getline(filmy, baza_filmow[i][5], ';');
getline(filmy, baza_filmow[i][6], ';');
getline(filmy, baza_filmow[i][7], ';');
getline(filmy, baza_filmow[i][8], '\n');
if (baza_filmow[i][0] != "")
i++;
}
int rozmiar_bazy_filmow = i;

     cout << i << endl; 
     string id;
     id = '1';
     if(baza_filmow[i][1] == id)
     {
         for (i = 0; i < 10; i++)
         {
             for (j = 0; j < 4; j++)
                 cout << baza_filmow[i][j];
         }
    }
     
}
else {
    cout << "BLAD ODCZYTU Z PLIKU" << endl;
}

pomoże jakaś dobra dusza.....

1

Bardziej poprawne będzie

struct Film {
   string nazwa_pola_1;
 ... 
}

Film baza_filmow[10];

Po numerku pola jest dość kiepskie

... ale nie chce mi działać:

Na takie stwierdzenie spotkasz się tylko z dowcipami o szklanej kuli

4

Najlepiej skorzystać z boost, zamiast kombinować.

std::vector<std::string> vec;
using namespace boost;
tokenizer<escaped_list_separator<char> > tk(
   line, escaped_list_separator<char>('\\', ',', '\"'));

std::copy(tk.begin(), {}, std::back_inserter(vec));
0

@Tomasz M. Myszak: https://www.boost.org/doc/libs/1_75_0/libs/tokenizer/doc/escaped_list_separator.htm to jest dokumentacja do tego co wrzucił @MarekR22
Nie ma wielkiej filozofii w tym, tokenizer daje Ci możliwość iterowania po polach CSVa jakby to był już wstępnie podzielony zestaw stringów. Podział następuje w zależności od tego co wpiszesz do escaped_list_separator.

0
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;

int main()
{
	ifstream file("data.txt");
	string line;
	ostringstream sout;
	int count=0;
	for(int row=1;getline(file,line);++row)
	{
		if(line.size()<=0) continue;
		istringstream sin(line);		
		int id;
		sin>>id;
		if(id==1)
		{
			sout<<row<<' ';
			++count;
		}
	}
	if(count>1)
	{
		cout<<"id 1 znaleziono "<<count<<" razy w wierszach: "<<sout.str()<<endl;
	}
	return 0;
}
1

@_13th_Dragon: można ciut prościej:

for (int row = 0, id; file >> id; ++row) {
    if(id == 1) {
        sout << row << ' ';
        ++count;
    }
    
    file.ignore(666, '\n');
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1