C++ Bc. 22 cpp

Z GeoWikiCZ
Přejít na: navigace, hledání
#include <iostream>
#include <sstream>
#include <vector>
#include <cctype>

typedef std::vector<std::string> Pole;

std::string CSV_zapis(const Pole& pole, char oddelovac=',');

int main()
{
  using namespace std;

  // vstup: pocet poli; dale nasleduji jednotliva pole, kazde zapsane
  //        na samostatnem radku
  istringstream 
    data("8\n"   // 8 je pocet poli 
         "1\n101MA1G\n3+3\n8\nz,zk\n*p\nMatematika 1\nDoc. Kocandrlova\n"
         "1\n151TGE1\n3+3\n6\nz,zk\np\nTechnicka geodezie 1\nIng. Ratiborsky\n"
         "1\n153OSYL\n1+2\n5\nkz\np\nOperacni system Linux\nIng. Pytel\n");

  int     N;
  data >> N; 
  Pole pole(N);
  getline(data, pole[0]);      // preskocim zbytek prvniho radku

  while (getline(data,pole[0]))
    {
      for (int k=1; k < N; k++)
      {
         getline(data, pole[k]);
      }

      string  csv = CSV_zapis(pole);
      cout << csv << endl;
    }
}


std::string CSV_zapis(const Pole& pole, char oddelovac)
{
  std::string csv;

  for (int i=0; i<pole.size(); i++)
    {
      const std::string& p = pole[i];

      // druhe a dalsi pole musi byt oddeleno
      if (i != 0) csv += oddelovac;

      // testuji, jestli pole musi byt uzavreno do uvozovek
      bool uvozovky = false;
      for (int i=0; !uvozovky && i<p.length(); i++)
        if ( p[i] == '"' ||
             p[i] == oddelovac ||
             std::isspace(p[i]) ) uvozovky = true;      // <cctype>

      if (uvozovky) csv += '"';
      for (int j=0; j<p.length(); j++)
        {
          csv += p[j];

          // uvozovky se zdvojuji
          if (p[j] == '"') csv += '"';
        }
      if (uvozovky) csv += '"';
    }

  return csv;
}
1,101MA1G,3+3,8,"z,zk",*p,"Matematika 1","Doc. Kocandrlova"
1,151TGE1,3+3,6,"z,zk",p,"Technicka geodezie 1","Ing. Ratiborsky"
1,153OSYL,1+2,5,kz,p,"Operacni system Linux","Ing. Pytel"

[ Zpět ]