Jak wyszukać znaki w ciągu znaków?

0

Witam, mam plik csv z wieloma liniami, wyciągam kolejno linie i szukam w nich znaków i zapisuję w tablicy pozycje tych znaków, aby to później wykorzystać. Interesuje mnie pionowa kreska, średnik i ciąg BSI. Częściowo to zrobiłem ale nie mogę przebrnąć dalej. Wymyśliłem sobie, że wstawię 2 lub 3 razy pętlę for w if(linia) ale wychodzą głupoty. Przy drugiej linii nie potrafi już znaleźć znaków. A dlaczego? Proszę o pomoc w przekształceniu tak aby działało wyszukiwaniu tych 3 rodzajów znaków.

while(!plikCsv.eof()) {

   starter=znaleziono=0;
   getline(plikCsv, textLinii);

   if(linia){
   //maksymalnie 17 szukanych znaków znajduje się w linii
     for (int a=0; a<17; a++){
       if(starter)znaleziono=textLinii.find("|", starter+1);
       else znaleziono=textLinii.find("|");

       if(a) starter=znaleziono+1;
       else starter=0;

       if(znaleziono!=string::npos){
         pozycja[a]=textLinii.find("|", starter+1);
         if(pozycja[a]<0 || pozycja[a-1]==0){
           pozycja[a]=0;
         }
       }
       else pozycja[a]=0;
     }
     linia++;
  }
}
1

@tuz: Jak na moje to strasznie to skomplikowałeś.
Dlaczego wykonujesz 17 iteracji pętli na jednym stringu - wiem, że to z powodu użycia metody find, zatem dlaczego ona?
Do odnalezienia konkretnych znaków w stringu wystarczy przeiterować jednokrotnie po wszystkich jego znakach.

0
Eldorad O. napisał(a):

@tuz: Jak na moje to strasznie to skomplikowałeś.
Dlaczego wykonujesz 17 iteracji pętli na jednym stringu - wiem, że to z powodu użycia metody find, zatem dlaczego ona?
Do odnalezienia konkretnych znaków w stringu wystarczy przeiterować jednokrotnie po wszystkich jego znakach.

a możesz mi to napisać? bo nie mam pojęcia jak obsłużyć koniec linii i nie wiem ile znaków może mieć linia

0

@tuz: Możesz zacząć tak:

    std::ifstream csv_file;

    unsigned int line_num{0};
    std::string line;
    while(std::getline(csv_file, line)) {
        for(auto c : line) {

        }
    }
0

To jest naiwna wersja (bo CSV jest nieco bardziej skomplikowane):

std::vector<std::vector<std::string>> readCSV(std::istream& in)
{
    std::vector<std::vector<std::string>> result;
    std::string line;
    while(getline(in, line)) {
        std::istringstream lineIn{line};
        std::string s;
        result.emplace_back();
        while(getline(lineIn, s, '|')) {
            result.back().emplace_back(s);
        }
    }
    return result;
}

https://godbolt.org/z/9rYEo9K8e

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