Чтение из 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;

}

2

Решение

Следующие работы с данным входом: 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;
}
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector