C++ Bc. 23 cpp: Porovnání verzí
Bez shrnutí editace |
Bez shrnutí editace |
||
| Řádek 1: | Řádek 1: | ||
#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 | |||
[ [[C plus plus Bc. 23 | Zpět]] ] | [ [[C plus plus Bc. 23 | Zpět]] ] | ||
Verze z 18. 3. 2006, 16:58
#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 ]