20 #include <QFileDialog>
21 #include <QFormLayout>
23 #include <QMessageBox>
24 #include <QPushButton>
26 #include <QTableWidget>
27 #include <QVBoxLayout>
35 , m_intensityColNum(-1)
36 , m_intensityMultiplier(1.0)
37 , m_coordinateColNum(-1)
38 , m_coordinateMultiplier(1.0)
42 , m_dataAvailable(false)
74 int res = selector.exec();
76 if (res == selector.Accepted) {
86 }
else if (res == selector.Rejected) {
125 size_t lastRow =
m_csvFile->NumberOfRows();
135 while (QString::fromStdString(accumulate(csvArray[lastRow - 1].begin(),
136 csvArray[lastRow - 1].end(), std::string(
"")))
150 csv::DataArray tmp(csvArray.begin(), csvArray.begin() +
int(lastRow));
170 std::unique_ptr<OutputData<double>> resultOutputData;
171 resultOutputData = std::make_unique<OutputData<double>>();
172 std::vector<double> intensityValues;
173 std::vector<double> coordinateValues;
179 resultOutputData->addAxis(coordAxis);
180 resultOutputData->setRawDataVector(intensityValues);
187 std::vector<double>& coordinateValues)
189 bool intensityOk =
true;
190 bool coordinateOk =
true;
194 double intensityValue = 0.;
195 double coordinateValue = 0.;
197 for (
size_t row = firstRow; row < lastRow; row++) {
201 QString intensityText =
203 intensityValue = intensityText.toDouble(&intensityOk);
206 if (isCoordinateNeeded) {
207 QString coordinateText =
209 coordinateValue = coordinateText.toDouble(&coordinateOk);
211 coordinateValue = row - firstRow;
215 if (intensityOk && coordinateOk) {
234 for (
size_t i = 0; i < nRows; i++) {
236 for (
size_t j = 0; j < nCols; j++) {
237 QString text = QString::fromStdString(
m_csvArray[i][j]).trimmed();
239 buffer1d.push_back(text.toStdString());
241 newNcols = std::max(buffer1d.size(), newNcols);
242 buffer2d.push_back(buffer1d);
245 if (buffer2d.empty()) {
250 for (
size_t i = 0; i < nRows; i++)
251 while (buffer2d[i].size() < newNcols)
252 buffer2d[i].push_back(
"");
255 nRows = buffer2d.size();
256 nCols = buffer2d[0].size();
269 std::vector<int> to_be_removed;
275 throw std::runtime_error(
"All inner vectors should have the same length already.");
279 for (
size_t j = 0; j < nCols; j++) {
281 for (
size_t i = 0; i < nRows; i++) {
284 if (QString::fromStdString(accumulate(buffer1d.begin(), buffer1d.end(), std::string(
"")))
289 buffer2d.push_back(buffer1d);
292 if (buffer2d.empty()) {
298 nCols = buffer2d.size();
299 nRows = buffer2d[0].size();
303 for (
size_t i = 0; i < nRows; i++) {
305 for (
size_t j = 0; j < nCols; j++) {
306 buffer1d.push_back(buffer2d[j][i]);
314 int frequencies[127] = {0};
319 std::vector<char> preferredSeparators;
320 preferredSeparators.push_back(
' ');
321 preferredSeparators.push_back(
',');
322 preferredSeparators.push_back(
';');
323 preferredSeparators.push_back(
'|');
324 preferredSeparators.push_back(
':');
325 preferredSeparators.push_back(
'\t');
329 preferredSeparators.push_back(
'\'');
330 preferredSeparators.push_back(
'\"');
337 frequencies[size_t(c)]++;
344 char guessedSep =
' ';
346 for (
char i = 0; i < 127; i++) {
347 if (std::find(preferredSeparators.begin(), preferredSeparators.end(), i)
348 != preferredSeparators.end())
349 if (frequencies[
int(i)] > freq) {
350 freq = frequencies[int(i)];
357 if (guessedSep ==
'\t')
365 auto tf = all_of(begin(dataArray), end(dataArray), [dataArray](
const csv::DataRow& x) {
366 return x.size() == dataArray.front().size();
374 msgBox.setText(QString::fromStdString(message));
375 msgBox.setIcon(msgBox.Critical);
Defines class DataSelector.
const std::map< Axes::Units, const char * > axisUnitLabel
DefinesStyleUtils namespace.
Wrapper for detector axes units, required for a better representation of detector axes units in pytho...
void setIntensityColumn(int iCol, double multiplier=1.0)
void removeMultipleWhiteSpaces()
csv::DataArray m_csvArray
std::set< int > m_rowsToDiscard
char guessSeparator() const
bool hasEqualLengthLines(csv::DataArray &dataArray)
void removeBlankColumns()
void setFirstRow(int iRow)
double m_intensityMultiplier
static void showErrorMessage(std::string message)
void setLastRow(int iRow)
ImportDataInfo fillData()
std::unique_ptr< CSVFile > m_csvFile
double m_coordinateMultiplier
CsvImportAssistant(const QString &file, const bool useGUI=false, QWidget *parent=nullptr)
void setCoordinateColumn(int iCol, Axes::Units units, double multiplier=1.0)
void runDataSelector(QWidget *parent)
void getValuesFromColumns(std::vector< double > &intensityVals, std::vector< double > &coordVals)
Dialog to hold DataSelector.
void setSeparator(char newSeparator)
int intensityColumn() const
double coordinateMultiplier() const
std::set< int > rowsToDiscard() const
double intensityMultiplier() const
Axes::Units units() const
void separatorChanged(char newSeparator)
int coordinateColumn() const
void setDataArray(csv::DataArray csvArray)
Carries information about loaded data.
Axis containing arbitrary (non-equidistant) coordinate values.
Defines namespace Constants.
Constants and functions for physical unit conversions.
std::vector< std::string > DataRow
std::vector< std::vector< std::string > > DataArray