C++ Bc. 23 cpp

Z GeoWikiCZ
#include <iostream>
#include <vector>
#include <string>
#include <sstream>

void CSV_cteni(std::string csv, std::vector<std::string>& pole, 
               char oddelovac=',');

int main()
{
  using namespace std;

  istringstream data(
   "1,101MA1G,3+3,8,\"z,zk\",*p,\"Matematika 1\",\"Doc. Kocandrlova\"\n"
   "1,151TGE1,3+3,6,\"z,zk\",p,\"Technicka geodezie 1\",\"Ing. Ratiborsky\"\n"
   "1,153OSYL,1+2,5,kz,p,\"Operacni system Linux\",\"Ing. Pytel\"\n");

  vector<string> pole(8);
  string radek;
  while (getline(data, radek))
    {
      CSV_cteni(radek, pole);

      for (int i=0; i<pole.size(); i++)
        cout << i << "  " << pole[i] << endl;
      cout << endl;
    }
}


void CSV_cteni(std::string csv, std::vector<std::string>& pole, 
               char oddelovac)
{
  int n = 0;   // index bezneho prvku ve vstupni retezci 'csv'

  const int N = csv.size();
  for (int i=0; i<pole.size(); i++)
    {
      bool uvozovky = csv[n] == '"';
      if (uvozovky) n++;

      std::string s;
      for(; n < N; n++)
        {
          if (csv[n] == '"')
            {
              // dvojice uvozovek oznacuje jeden znak '"' 
              if (n+1 < N && csv[n+1] == '"')
                {
                  // ulozim znak '"' a prejdu na dalsi symbol
                  s += '"';
                  n++;
                  continue;
                }

              // koncove uvozovky 
              uvozovky = false;
              continue;
            }
          
          if (!uvozovky && csv[n] == oddelovac)
            {
              n++;
              break;
            }

          s += csv[n];
        }

      pole[i] = s;
    }
}
0  1
1  101MA1G
2  3+3
3  8
4  z,zk
5  *p
6  Matematika 1
7  Doc. Kocandrlova

0  1
1  151TGE1
2  3+3
3  6
4  z,zk
5  p
6  Technicka geodezie 1
7  Ing. Ratiborsky

0  1
1  153OSYL
2  1+2
3  5
4  kz
5  p
6  Operacni system Linux
7  Ing. Pytel

[ Zpět ]