Чтение из CSV/текстового файла с кавычками на С++

У меня есть рабочая функция, которая читает строки из текстового файла (CSV), но мне нужно изменить ее, чтобы иметь возможность читать двойные кавычки (мне нужны эти двойные кавычки, потому что некоторые из моих строковых значений содержат запятые, поэтому я использую двойные кавычки, чтобы обозначить тот факт, что функция чтения должна игнорировать запятые между двойными кавычками). Есть ли относительно простой способ изменить приведенную ниже функцию, чтобы учесть тот факт, что некоторые поля будут заключены в двойные кавычки?

Несколько других заметок:

  1. Я мог бы довольно легко заключить все поля в двойные кавычки, если это поможет (а не только те, которые являются строками, как в настоящее время)

  2. Я также мог бы довольно легко изменить разделитель с запятой на какой-либо другой символ (например, вертикальную черту), но надеялся придерживаться CSV, если это легко сделать.

Вот моя текущая функция:

void ReadLoanData(vector<ModelLoanData>& mLoan, int dealnum) {

// Variable declarations
fstream InputFile;
string CurFileName;
ostringstream s1;
string CurLineContents;
int LineCounter;
char * cstr;
vector<string> currow;
const char * delim = ",";

s1 << "ModelLoanData" << dealnum << ".csv";
CurFileName = s1.str();
InputFile.open(CurFileName, ios::in);

if (InputFile.is_open()) {

    LineCounter = 1;
    while (InputFile.good()) {
        // Grab the line
        while (getline (InputFile, CurLineContents)) {

            // Create a c-style string so we can tokenize
            cstr = new char [CurLineContents.length()+1];
            strcpy (cstr, CurLineContents.c_str());

            // Need to resolve the "blank" token issue (strtok vs. strsep)
            currow = split(cstr,delim);

            // Assign the values to our model loan data object
            mLoan[LineCounter] = AssignLoanData(currow);

            delete[] cstr;
            ++LineCounter;
        }   
    }
    // Close the input file
    InputFile.close();
}
else
    cout << "Error: File Did Not Open" << endl;

}


person brentf    schedule 25.07.2013    source источник
comment
Сначала разберите данные по кавычкам. Могу я получить пример строки с кавычками?   -  person andre    schedule 25.07.2013
comment
0,1,1.000,LNMLT06C01-1.000,001A1,North Point Mall,3/1/2006,1.62E+08,1.442464E+08,0,5.743594E-02,85,35,-999,275,NO,1024760, True, False, False, Current, 3.309E+08,2/16/2006,-1E+09,0,12:00:00, 1.17,12/31/2011,0.4359215,2/16/2006,0,49 ,100,False,2,3/1/2014,0,0,0,2.555719E+07,7057785,1.84994E+07,1/1/2011,12/31/2011,2.555719E+07,7288255, 0,2.532651Е+07,0,1.803826Е+07,2.722289Е+07,7510764,1.971213Е+07   -  person brentf    schedule 25.07.2013


Ответы (1)


С данным вводом работает следующее: a,b,c,"a,b,c","a,b",d,e,f

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
    std::string line;
    while(std::getline(cin, line, '"')) {
        std::stringstream ss(line);
        while(std::getline(ss, line, ',')) {
            cout << line << endl;
        }
        if(std::getline(cin, line, '"')) {
            cout << line;
        }
    }
}
person andre    schedule 25.07.2013