Line data Source code
1 : /*
2 : * CsvParser.cpp
3 : *
4 : * Created on: Jun 16, 2016
5 : * Author: tobias
6 : */
7 :
8 : #include "CsvParser.h"
9 :
10 : using namespace std;
11 :
12 467 : CsvParser::CsvParser() {
13 :
14 467 : }
15 :
16 176 : vector<string> CsvParser::parseLine(string *line){
17 176 : vector<string> elements;
18 352 : stringstream ss(*line);
19 :
20 352 : string cell;
21 :
22 176 : if(line->empty() || line->size() <= 2){
23 0 : return elements;
24 : }
25 :
26 1688 : while( ss.good() )
27 : {
28 1336 : getline( ss, cell, ',' );
29 1336 : cell = cell.substr(1, cell.length() );
30 2677 : while (*cell.rbegin() != '"' && ss.good() ){
31 5 : string other_parts;
32 5 : getline( ss, other_parts, ',' );
33 5 : cell = cell + other_parts;
34 5 : }
35 :
36 1336 : cell = cell.substr( 0 , cell.length() - 1);
37 :
38 1336 : elements.push_back(cell);
39 : }
40 176 : return elements;
41 :
42 : }
43 :
44 132 : void CsvParser::splitInterest(string cell, string &key, string &value){
45 132 : stringstream ss(cell);
46 264 : string temp;
47 132 : LOGG(DEBUG) << "Spliting interest " << cell;
48 528 : while (ss.good()){
49 264 : getline(ss, temp, ':');
50 :
51 264 : if (ss.peek() == ':'){
52 132 : ss.ignore();
53 132 : key = temp;
54 : }
55 264 : value = temp;
56 : }
57 264 : LOGG(DEBUG)<< "Splited in "<< key << "," << value;
58 132 : }
59 :
60 65 : void CsvParser::makeInterests(string keyValues, Interests &interests){
61 130 : string key,value;
62 :
63 65 : if (keyValues.back() == '\"') {
64 0 : keyValues.pop_back();
65 : }
66 :
67 130 : stringstream ss(keyValues);
68 :
69 130 : string cell;
70 262 : while (ss.good()) {
71 132 : getline(ss, cell, '|');
72 :
73 132 : if (ss.peek() == '|'){
74 67 : ss.ignore();
75 : }
76 :
77 132 : this->splitInterest(cell, key, value);
78 : //cout << key.c_str() << "," << value.c_str() << endl;
79 132 : interests.add(key,value);
80 65 : }
81 :
82 65 : }
83 :
84 56 : bool CsvParser::makeUser(string user_str, User &user){
85 56 : vector<string> parsed = this->parseLine(&user_str);
86 112 : Interests interests;
87 56 : int desf = 0;
88 56 : int count_elem = parsed.size();
89 :
90 56 : if ( (count_elem < USER_DATA_COUNT - 1) || (count_elem > USER_DATA_COUNT)){
91 10 : return false;
92 : }
93 :
94 46 : if (parsed.size() == USER_DATA_COUNT){
95 36 : string idS = parsed[ID_FULL_IDX];
96 36 : if ( ! isInteger(idS)){
97 0 : return false;
98 : }
99 36 : int id = stoi(idS);
100 36 : user.setId(id);
101 36 : desf = 1;
102 : }else{
103 10 : LOGG(WARNING) << "Parsing user without ID";
104 : }
105 92 : string xS = parsed[LOCX_FULL_IDX - 1 + desf];
106 92 : string yS = parsed[LOCY_FULL_IDX - 1 + desf];
107 92 : string age = parsed[AGE_IDX + desf];
108 :
109 :
110 46 : if (! isFloat(xS) || ! isFloat(yS) || ! isInteger(age)){
111 15 : return false;
112 : }
113 :
114 62 : string name = parsed[NAME_IDX + desf];
115 62 : string alias = parsed[ALIAS_IDX + desf];
116 62 : string sex = parsed[SEX_IDX + desf];
117 62 : string mail = parsed[MAIL_IDX + desf];
118 31 : float x =stof(xS);
119 31 : float y =stof(yS);
120 :
121 31 : user.setCommonData(mail,alias,name,sex);
122 31 : user.setLocation(x,y);
123 31 : user.setAge(stoi(age));
124 31 : user.setDescription(parsed[DSC_IDX + desf]);
125 :
126 31 : this->makeInterests(parsed[INT_IDX + desf], interests);
127 31 : user.setInterests(interests);
128 :
129 87 : return true;
130 :
131 : }
132 :
133 20 : bool CsvParser::makeSignupUser(string user_str,User &user){
134 20 : vector<string> parsed = this->parseLine(&user_str);
135 :
136 20 : if (parsed.size() != USER_DATA_FOR_CLIENT_COUNT){
137 0 : return false;
138 : }
139 :
140 40 : Interests interests;
141 40 : string age = parsed[AGE_IDX];
142 40 : string name = parsed[NAME_IDX];
143 40 : string alias = parsed[ALIAS_IDX];
144 40 : string sex = parsed[SEX_IDX];
145 40 : string mail = parsed[MAIL_IDX];
146 :
147 20 : if (! isInteger(age)){
148 5 : return false;
149 : }
150 :
151 15 : user.setCommonData(mail, alias, name, sex);
152 :
153 : //defualt location
154 15 : user.setLocation(0, 0);
155 :
156 :
157 15 : user.setAge(stoi(age));
158 15 : user.setDescription(parsed[DSC_IDX]);
159 :
160 15 : this->makeInterests(parsed[INT_IDX], interests);
161 15 : user.setInterests(interests);
162 35 : return true;
163 : }
164 :
165 25 : bool CsvParser::makePutUser(string user_str, string base_user, User& user){
166 25 : vector<string> parsedOriginal = this->parseLine(&base_user);
167 50 : vector<string> modifications = this->parseLine(&user_str);
168 50 : vector<string> parsed = this->parseLine(&user_str);
169 :
170 25 : if ( modifications.size() > (USER_DATA_UPDATE_COUNT)){
171 16 : return false;
172 : }
173 : //FromOriginal
174 18 : string idS = parsedOriginal[ID_FULL_IDX];
175 18 : string alias = parsedOriginal[ALIAS_FULL_IDX];
176 18 : string mail = parsedOriginal[MAIL_FULL_IDX];
177 18 : string xS = parsedOriginal[LOCX_FULL_IDX];
178 18 : string yS = parsedOriginal[LOCY_FULL_IDX];
179 :
180 : //Modifications
181 18 : string name = modifications[NAME_UPDATE_IDX];
182 18 : string age = modifications[AGE_UPDATE_IDX];
183 :
184 : //Modifications shuffled
185 18 : string sex = modifications[SEX_UPDATE_IDX];
186 9 : if ( ! isInteger(age) || ! isInteger(idS)){
187 0 : return false;
188 : }
189 9 : if ( ! isFloat(xS) || ! isFloat(yS)){
190 0 : return false;
191 : }
192 18 : Interests interests;
193 9 : this->makeInterests(modifications[INT_UPDATE_IDX], interests);
194 :
195 9 : float x = stof(xS);
196 9 : float y = stof(yS);
197 9 : int id = stoi(idS);
198 :
199 9 : user.setInterests(interests);
200 9 : user.setLocation(x, y);
201 9 : user.setId(id);
202 9 : user.setCommonData(mail, alias, name, sex);
203 9 : user.setAge(stoi(age));
204 :
205 34 : return true;
206 : }
207 :
208 124 : string CsvParser::userToCsvFull(User *user){
209 1364 : string user_str[USER_DATA_COUNT];
210 124 : string parsed = "\"";
211 :
212 124 : user_str[NAME_FULL_IDX] = user->getName();
213 124 : user_str[MAIL_FULL_IDX]= user->getMail();
214 124 : user_str[ALIAS_FULL_IDX] = user->getAlias();
215 124 : user_str[SEX_FULL_IDX] = user->getSex();
216 124 : user_str[AGE_FULL_IDX] = to_string(user->getAge());
217 124 : user_str[ID_FULL_IDX] = to_string(user->getID());
218 124 : user_str[DSC_FULL_IDX] = user->getDescription();
219 124 : user_str[LOCX_FULL_IDX] = to_string(user->getX());
220 124 : user_str[LOCY_FULL_IDX] = to_string(user->getY());
221 124 : user_str[INT_FULL_IDX] = this->interestToCsv(user->getInterests());
222 :
223 1364 : for (int i = 0; i < USER_DATA_COUNT; i++){
224 1240 : parsed+= user_str[i] + "\",\"";
225 : }
226 124 : parsed = parsed.substr(0,parsed.length() - 2);
227 :
228 1364 : return parsed;
229 : }
230 :
231 10 : string CsvParser::userToCsvForClient(User *user, bool with_id){
232 10 : int addId = 0;
233 :
234 10 : if (with_id){
235 5 : addId = 1;
236 : }
237 :
238 95 : string user_str[USER_DATA_FOR_CLIENT_COUNT + addId];
239 10 : string parsed = "\"";
240 :
241 10 : user_str[NAME_IDX + addId] = user->getName();
242 10 : user_str[MAIL_IDX + addId]= user->getMail();
243 10 : user_str[ALIAS_IDX + addId] = user->getAlias();
244 10 : user_str[SEX_IDX + addId] = user->getSex();
245 10 : user_str[AGE_IDX + addId] = to_string(user->getAge());
246 10 : user_str[DSC_IDX + addId] = user->getDescription();
247 10 : user_str[INT_IDX + addId] = this->interestToCsv(user->getInterests());
248 :
249 10 : if (with_id)
250 5 : user_str[ID_FULL_IDX] = to_string(user->getID());
251 :
252 85 : for (int i = 0; i < USER_DATA_FOR_CLIENT_COUNT + addId; i++){
253 75 : parsed+= user_str[i] + "\",\"";
254 : }
255 10 : parsed = parsed.substr(0,parsed.length() - 2);
256 :
257 95 : return parsed;
258 : }
259 :
260 139 : string CsvParser::interestToCsv(Interests * interests){
261 139 : string str = "";
262 278 : map<string,vector<string>> inter = interests->allInterests();
263 139 : map<string,vector<string>>::iterator it = inter.begin();
264 :
265 431 : for(; it != inter.end(); ++it){
266 292 : string key = it->first;
267 624 : for (unsigned int i = 0; i < it->second.size(); i++){
268 332 : string value = it->second[i];
269 332 : str += key + "::" + value + "||";
270 332 : }
271 292 : }
272 :
273 139 : str = str.substr(0, str.length() - 2 );
274 :
275 278 : return str;
276 : }
277 :
278 5 : void CsvParser::removeId(string &data){
279 5 : vector<string> parsed = this->parseLine(&data);
280 10 : string user_str;
281 5 : parsed.erase(parsed.begin() + ID_FULL_IDX);
282 :
283 5 : user_str = "\"";
284 40 : for (unsigned int i = 0; i < parsed.size(); i++){
285 35 : user_str+= parsed[i] + "\",\"";
286 : }
287 10 : data = user_str.substr(0,user_str.length() - 2);
288 :
289 :
290 5 : }
291 :
292 467 : CsvParser::~CsvParser() {
293 533 : }
294 :
|