PascalVKooten
PascalVKooten

Reputation: 21453

Reading in quoted CSV data without newline as endline

I have an issue with a file I am trying to read in and I don't know how to do solve it.

The file is a CSV, but there are also commas in the text of the file, so there are quotes around the commas indicating new values.

For instance:

"1","hello, ""world""","and then this"  // In text " is written as ""

I would like to know how to deal quotes using a QFileStream (though I haven't seen a base solution either).

Furthermore, another problem is that I also can't read line by line as within these quotes there might be newlines.

In R, there is an option of quotes="" which solves these problems.

There must be something in C++. What is it?

Upvotes: 1

Views: 917

Answers (2)

Shf
Shf

Reputation: 3493

You can split by quote (not just quote, but any symbol, like '\' for example) symbol in qt, just put \ before it, Example : string.split("\""); will split string by '"' symbol.

Here is a simple console app to split your file (the easiest solution is to split by "," symbols seems so far):

// opening file split.csv, in this case in the project folder
QFile file("split.csv");
file.open(QIODevice::ReadOnly);
// flushing out all of it's contents to stdout, just for testing
std::cout<<QString(file.readAll()).toStdString()<<std::endl;
// reseting file to read again
file.reset();
// reading all file to QByteArray, passing it to QString consructor, 
// splitting that string by "," string and putting it to QStringList list
// where every element of a list is value from cell in csv file
QStringList list=QString(file.readAll()).split("\",\"",QString::SkipEmptyParts);

// adding back quotes, that was taken away by split
for (int i=0; i<list.size();i++){
    if (i!=0) list[i].prepend("\"");
    if (i!=(list.size()-1)) list[i].append("\"");
}//*/
// flushing results to stdout
foreach (QString i,list)    std::cout<<i.toStdString()<<std::endl; // not using QDebug, becouse it will add more quotes to output, which is already confusing enough

where split.csv contains "1","hello, ""world""","and then this" and the output is:

"1"
"hello, ""world"""
"and then this"

Upvotes: 2

Marek R
Marek R

Reputation: 37762

After googling I've found some ready solution. See this article about qxt.

Upvotes: 1

Related Questions