how i can identify and read the columns of a csv file ?
-
Lifetime Qt Championwrote on 1 Jul 2021, 08:40 last edited by jsulm 7 Jan 2021, 08:41
@julie546 said in how i can identify and read the columns of a csv file ?:
I can only read the first column but I would need the 2nd and 3rd
Then read them. What is the problem, really?
QStringList elements = line.split(';'); //elements[0] -> first element ("column") //elements[1] -> second element ...
-
@JonB said in how i can identify and read the columns of a csv file ?:
@julie546
And additonal to @jsulm you are splitting on;
, normally a CSV file elements are separated by,
?the default depends on your region, really.
Some languages use,
as decimal point, than its usually;
as a separatorwrote on 1 Jul 2021, 08:45 last edited by JonB 7 Jan 2021, 08:47@J-Hilk said in how i can identify and read the columns of a csv file ?:
Some languages use , as decimal point, than its usually ; as a separator
Gosh, I didn't realize that (the changed separator, and the comma in numbers being what is in the file). So a CSV file containing only numbers, say, is not portable across regions? I assumed they would export/import locale-independent, like C locale. This is bad!
-
how i can identify and read the columns of a csv file ?
I managed to open the file and identify the first column by : QStringList coordXList;
while (!filelidar.atEnd()) {
QByteArray line = filelidar.readLine();
coordXList.append(line.split(';').first());
QStringList coordXList;
}qDebug() << coordXList;
and I couldn't find how I can identify and read and the other columns how can i do it please
wrote on 1 Jul 2021, 08:49 last edited by@julie546 said in how i can identify and read the columns of a csv file ?:
how i can identify and read the columns of a csv file ?
I would suggest you to give qtcsv a try.
This should simplify working with CSV files -
wrote on 1 Jul 2021, 08:53 last edited by JonB 7 Jan 2021, 08:54
@julie546
@KroMignon has just recommended using qtcsv. I recommended same yesterday in post https://forum.qt.io/topic/128052/read-csv-file-values-and-put-these-values-in-a-graph/4 where someone asked about parsing CSV files. have a look at that, there are also other suggestions from a stackoverflow post (https://stackoverflow.com/questions/27318631/parsing-through-a-csv-file-in-qt), depending on how complex your situation is. -
@julie546
@KroMignon has just recommended using qtcsv. I recommended same yesterday in post https://forum.qt.io/topic/128052/read-csv-file-values-and-put-these-values-in-a-graph/4 where someone asked about parsing CSV files. have a look at that, there are also other suggestions from a stackoverflow post (https://stackoverflow.com/questions/27318631/parsing-through-a-csv-file-in-qt), depending on how complex your situation is.wrote on 1 Jul 2021, 13:22 last edited by julie546 7 Jan 2021, 13:23@JonB @KroMignon @jsulm @J-Hilk
thank you for your answer I was able to solve the problem with
coordXList.append (line.split (','). at (0));
coordYList.append (line.split (','). at (1));
but I would like to put these values in a curve using the Qchart
I tried with
QLineSeries * series = new QLineSeries ();
series-> append (coordXList, coordYList);
but I got an error : no matching membre function for call to append
can you help me please -
@JonB @KroMignon @jsulm @J-Hilk
thank you for your answer I was able to solve the problem with
coordXList.append (line.split (','). at (0));
coordYList.append (line.split (','). at (1));
but I would like to put these values in a curve using the Qchart
I tried with
QLineSeries * series = new QLineSeries ();
series-> append (coordXList, coordYList);
but I got an error : no matching membre function for call to append
can you help me please@julie546 said in how i can identify and read the columns of a csv file ?:
but I got an error : no matching membre function for call to append
can you help me pleaseof course,
QLineSeries has 3 overloads- append(qreal , qreal )
- append(const QPointF &)
- append(const QList<QPointF> &)
non of those fit your append(Container<ofSomeType>, Container<ofSomeType>)
-
@julie546 said in how i can identify and read the columns of a csv file ?:
but I got an error : no matching membre function for call to append
can you help me pleaseof course,
QLineSeries has 3 overloads- append(qreal , qreal )
- append(const QPointF &)
- append(const QList<QPointF> &)
non of those fit your append(Container<ofSomeType>, Container<ofSomeType>)
wrote on 1 Jul 2021, 13:32 last edited by julie546 7 Jan 2021, 13:33@J-Hilk so I can't display a graph from a csv file?
-
@JonB @KroMignon @jsulm @J-Hilk
thank you for your answer I was able to solve the problem with
coordXList.append (line.split (','). at (0));
coordYList.append (line.split (','). at (1));
but I would like to put these values in a curve using the Qchart
I tried with
QLineSeries * series = new QLineSeries ();
series-> append (coordXList, coordYList);
but I got an error : no matching membre function for call to append
can you help me pleasewrote on 1 Jul 2021, 13:33 last edited by@julie546 said in how i can identify and read the columns of a csv file ?:
thank you for your answer I was able to solve the problem with
coordXList.append (line.split (','). at (0));
coordYList.append (line.split (','). at (1));This is a dangerous and no effective way to do!
line.split(',')
may return an emptyQStringList
, soline.split (','). at(0)
will crash your application.
And why splitting twice?I would do it like this:
const auto parts = line.split (','); if(parts.size() >= 2) { coordXList.append(parts.at(0)); coordYList.append(parts.at(1)); }
but I would like to put these values in a curve using the Qchart
I tried with
QLineSeries * series = new QLineSeries ();
series-> append (coordXList, coordYList);
but I got an error : no matching membre function for call to append
can you help me pleaseHave you read
QLineSeries::append()
documentation??
There is not overload forQLineSeries::append(QStringList, QStringList)
! -
wrote on 1 Jul 2021, 13:34 last edited by
@julie546 said in how i can identify and read the columns of a csv file ?:
so I can't display a graph from a csv file?
Why not?
You have to convert your value to a compatible type. That's all. -
@julie546 thats not how programming works.
I assume
coordXList
andcoordYList
are string lists ?than you may, and I emphasise may, get away with:
QLineSeries * series = new QLineSeries (); for(int i{0}, j{qMin(coordXList.size(), coordYList.size())}; i<j; i++){ series-> append (coordXList.at(i).toFloat(), coordYList.at(i).toFloat()); }
-
@julie546 thats not how programming works.
I assume
coordXList
andcoordYList
are string lists ?than you may, and I emphasise may, get away with:
QLineSeries * series = new QLineSeries (); for(int i{0}, j{qMin(coordXList.size(), coordYList.size())}; i<j; i++){ series-> append (coordXList.at(i).toFloat(), coordYList.at(i).toFloat()); }
wrote on 1 Jul 2021, 13:46 last edited by julie546 7 Jan 2021, 13:47@J-Hilk yes here is my output ("Y", "0.170138", "0.161089", "0.15901", "0.157898", "0.159706", "0.162481", "0.167204", "0.172876", "0.169802", "0.1677",.....................)
theres an error with series-> append (coordXList.at(i).toFloat(), coordYList.toFloat());
no member named toFloat in QStringList
@KroMignon @J-Hilk can you help me please I am a beginner c ++ I am a student in mechanics but I need qt for my end of study internship -
@J-Hilk yes here is my output ("Y", "0.170138", "0.161089", "0.15901", "0.157898", "0.159706", "0.162481", "0.167204", "0.172876", "0.169802", "0.1677",.....................)
theres an error with series-> append (coordXList.at(i).toFloat(), coordYList.toFloat());
no member named toFloat in QStringList
@KroMignon @J-Hilk can you help me please I am a beginner c ++ I am a student in mechanics but I need qt for my end of study internship@julie546 said in how i can identify and read the columns of a csv file ?:
no member named toFloat in QStringList
typo on my side, fixed it, but you should be able to fix that as well
-
@J-Hilk yes here is my output ("Y", "0.170138", "0.161089", "0.15901", "0.157898", "0.159706", "0.162481", "0.167204", "0.172876", "0.169802", "0.1677",.....................)
theres an error with series-> append (coordXList.at(i).toFloat(), coordYList.toFloat());
no member named toFloat in QStringList
@KroMignon @J-Hilk can you help me please I am a beginner c ++ I am a student in mechanics but I need qt for my end of study internshipwrote on 1 Jul 2021, 13:59 last edited by KroMignon 7 Jan 2021, 13:59@julie546 said in how i can identify and read the columns of a csv file ?:
can you help me please I am a beginner c ++ I am a student in mechanics but I need qt for my end of study internship
We have all started as beginner. I have studied electronics, not informatics, so I understand well your problem ;)
The easiest way to create the QLineSeries, is to do it while parsing:
QLineSeries * series = new QLineSeries(); while (!filelidar.atEnd()) { QString line = filelidar.readLine(); const auto parts = line.split (','); if(parts.size() >= 2) { bool ok; qreal x = parts.at(0).toFloat(&ok); if(!ok) continue; qreal y = parts.at(1).toFloat(&ok); if(!ok) continue; series->append(x, y); } }
-
@julie546 said in how i can identify and read the columns of a csv file ?:
can you help me please I am a beginner c ++ I am a student in mechanics but I need qt for my end of study internship
We have all started as beginner. I have studied electronics, not informatics, so I understand well your problem ;)
The easiest way to create the QLineSeries, is to do it while parsing:
QLineSeries * series = new QLineSeries(); while (!filelidar.atEnd()) { QString line = filelidar.readLine(); const auto parts = line.split (','); if(parts.size() >= 2) { bool ok; qreal x = parts.at(0).toFloat(&ok); if(!ok) continue; qreal y = parts.at(1).toFloat(&ok); if(!ok) continue; series->append(x, y); } }
wrote on 1 Jul 2021, 15:00 last edited by julie546 7 Jan 2021, 15:28@KroMignon yes it's really difficult to work in a field that you don't study
thank you for your answer I tried like that but I still have an empty curveif (!filelidar.open(QFile::ReadOnly | QFile::Text) ) {
qDebug() << "File not exists";
} else {QLineSeries * series = new QLineSeries(); while (!filelidar.atEnd()) { QString line = filelidar.readLine(); const auto parts = line.split (','); if(parts.size() >= 2) { bool ok; qreal x = parts.at(0).toFloat(&ok); if(!ok) continue; qreal y = parts.at(1).toFloat(&ok); if(!ok) continue; series->append(x, y); } } QChart *chart = new QChart(); chart->legend()->hide(); chart->addSeries(series); chart->createDefaultAxes(); chart->setTitle("Lidar tg15"); QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); QMainWindow window; window.setCentralWidget(chartView); window.resize(1000, 1000); window.show(); /
}
} -
@KroMignon yes it's really difficult to work in a field that you don't study
thank you for your answer I tried like that but I still have an empty curveif (!filelidar.open(QFile::ReadOnly | QFile::Text) ) {
qDebug() << "File not exists";
} else {QLineSeries * series = new QLineSeries(); while (!filelidar.atEnd()) { QString line = filelidar.readLine(); const auto parts = line.split (','); if(parts.size() >= 2) { bool ok; qreal x = parts.at(0).toFloat(&ok); if(!ok) continue; qreal y = parts.at(1).toFloat(&ok); if(!ok) continue; series->append(x, y); } } QChart *chart = new QChart(); chart->legend()->hide(); chart->addSeries(series); chart->createDefaultAxes(); chart->setTitle("Lidar tg15"); QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); QMainWindow window; window.setCentralWidget(chartView); window.resize(1000, 1000); window.show(); /
}
}wrote on 1 Jul 2021, 15:07 last edited by Pl45m4 7 Jan 2021, 15:10@julie546 said in how i can identify and read the columns of a csv file ?:
qreal x = parts.at(0).toFloat(&ok);
if(!ok)
continue;
qreal y = parts.at(1).toFloat(&ok);Print the values for
x
andy
and check if these are the values from your file.
The code from @KroMignon doesn't look wrong. -
@julie546 said in how i can identify and read the columns of a csv file ?:
qreal x = parts.at(0).toFloat(&ok);
if(!ok)
continue;
qreal y = parts.at(1).toFloat(&ok);Print the values for
x
andy
and check if these are the values from your file.
The code from @KroMignon doesn't look wrong.wrote on 1 Jul 2021, 15:27 last edited by julie546 7 Jan 2021, 15:27@Pl45m4 @KroMignon yes I have checked I have the right values now I have a graph but it is not the same that I do with the csv file, I cannot find the same graph, what do you think please ?
-
@Pl45m4 @KroMignon yes I have checked I have the right values now I have a graph but it is not the same that I do with the csv file, I cannot find the same graph, what do you think please ?
wrote on 1 Jul 2021, 15:32 last edited by@julie546 said in how i can identify and read the columns of a csv file ?:
but it is not the same that I do with the csv file,
What do you mean with not the same?
-
@julie546 said in how i can identify and read the columns of a csv file ?:
but it is not the same that I do with the csv file,
What do you mean with not the same?
wrote on 1 Jul 2021, 15:38 last edited by@KroMignon this is what I found with qt
and this is what I have to find
despite I made qDebug () << x;
qDebug () << y;
and I found the same values with csv file -
@KroMignon this is what I found with qt
and this is what I have to find
despite I made qDebug () << x;
qDebug () << y;
and I found the same values with csv filewrote on 1 Jul 2021, 15:49 last edited by julie546 7 Jan 2021, 15:49This post is deleted! -
@julie546
Hi
If you look closely they are the same.
Its just you are using QLineSeries which draws lines between the points so
that why it looks differernt.Maybe the scatter type can be used
https://doc.qt.io/qt-5/qtcharts-scatterchart-example.htmlinstead of the LineSeries.
15/49