具有多个EOL字符的常规CSV解析器

时间:2015-03-08 19:23:13

标签: c++ parsing csv

我正在尝试更改此功能,以便在使用\r结尾时提供CSV文件时进行说明。我似乎无法弄清楚如何将getline()考虑在内。

vector<vector<string>> Parse::parseCSV(string file)
{
    // input fstream instance
    ifstream inFile;
    inFile.open(file);

    // check for error
    if (inFile.fail()) { cerr << "Cannot open file" << endl; exit(1); }

    vector<vector<string>> data;
    string line;

    while (getline(inFile, line))
    {
        stringstream inputLine(line);
        char delimeter = ',';
        string word;
        vector<string> brokenLine;
        while (getline(inputLine, word, delimeter)) {
            word.erase(remove(word.begin(), word.end(), ' '), word.end());      // remove all white spaces
            brokenLine.push_back(word);
        }
        data.push_back(brokenLine);
    }

    inFile.close();

    return data;

};

1 个答案:

答案 0 :(得分:0)

这可能是Getting std :: ifstream to handle LF, CR, and CRLF?的副本。最佳答案特别好。

如果您知道每一行以\r结尾,则始终可以使用getline指定getline(input, data, '\r')分隔符,其中输入是流,数据是字符串,第三个参数是分裂的角色。在第一个while循环开始后你也可以尝试类似下面的内容

// after the start of the first while loop
stringstream inputLine;
size_t pos = line.find('\r');
if(pos < line.size()) {
    inputLine << std::string(x.begin(), x.begin() + p);
    inputLine << "\n"
    inputLine << std::string(x.begin() + p + 1, x.end());
} else {
    inputLine << line;
}
// the rest of your code here