| 3 | #include "lib/external/csvreader.h" |
| 4 | |
| 5 | std::vector<std::string> CsvReader::readLine() |
| 6 | { |
| 7 | enum state_t |
| 8 | { |
| 9 | UNQUOTED, |
| 10 | QUOTED, |
| 11 | QUOTEDQUOTE |
| 12 | }; |
| 13 | |
| 14 | std::vector<std::string> results; |
| 15 | std::string row; |
| 16 | std::getline(_istream, row); |
| 17 | if (_istream.bad() || _istream.fail()) |
| 18 | return results; |
| 19 | |
| 20 | results.push_back(""); |
| 21 | state_t state = UNQUOTED; |
| 22 | size_t index = 0; |
| 23 | for (char c : row) |
| 24 | { |
| 25 | switch (state) |
| 26 | { |
| 27 | case UNQUOTED: |
| 28 | switch (c) |
| 29 | { |
| 30 | case ',': |
| 31 | results.push_back(""); |
| 32 | index++; |
| 33 | break; |
| 34 | |
| 35 | case '"': |
| 36 | state = QUOTED; |
| 37 | break; |
| 38 | |
| 39 | default: |
| 40 | results[index].push_back(c); |
| 41 | break; |
| 42 | } |
| 43 | break; |
| 44 | |
| 45 | case QUOTED: |
| 46 | switch (c) |
| 47 | { |
| 48 | case '"': |
| 49 | state = QUOTEDQUOTE; |
| 50 | break; |
| 51 | |
| 52 | default: |
| 53 | results[index].push_back(c); |
| 54 | break; |
| 55 | } |
| 56 | break; |
| 57 | |
| 58 | case QUOTEDQUOTE: |
| 59 | switch (c) |
| 60 | { |
| 61 | case ',': |
| 62 | results.push_back(""); |