C++ Bc. 22 cpp: Porovnání verzí
Bez shrnutí editace |
Bez shrnutí editace |
||
| Řádek 1: | Řádek 1: | ||
#include <iostream> | |||
#include <sstream> | |||
#include <vector> | |||
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; | |||
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" | |||
[ [[C plus plus Bc. 22 | Zpět]] ] | [ [[C plus plus Bc. 22 | Zpět]] ] | ||
Verze z 18. 3. 2006, 15:54
#include <iostream>
#include <sstream>
#include <vector>
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;
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 ]