【问题标题】:QT C++ All datas shown on same column when export csv?QT C ++导出csv时所有数据都显示在同一列上吗?
【发布时间】:2022-08-02 21:56:00
【问题描述】:

我想将一组数据保存在 csv 文件中。我注册没有问题。 我的问题是储蓄的形式。所有数据都收集在 A 列中。我总共有 2 个图表,graph1 和 graph2。 Graph1 应该在 A 列中,Graph2 应该在 B 列中。我该如何设置。

这是导出 csv 的代码

void MainWindow::exportArraysToCSV(QStringList labelList, QList < QList < double >> dataColums, QChar sep) {
  QString filters(\"CSV files (*.csv);;All files (*.*)\");
  QString defaultFilter(\"CSVi files (*.csv)\");
  QString fileName = QFileDialog::getSaveFileName(0, \"Save file\", QCoreApplication::applicationDirPath(),
    filters, & defaultFilter);
  QFile file(fileName);

  if (file.open(QFile::WriteOnly | QFile::Append)) {
    QTextStream data( & file);
    QStringList strList;

    foreach(auto label, labelList) {
      if (label.length() > 0)
        strList.append(\"\\\"\" + label + \"\\\"\");
      else
        strList.append(\"\");
    }

    data << strList.join(\",\") << \"\\n\";

    int maxRowCount = 0;
    foreach(auto column, dataColums)
    maxRowCount = qMax(maxRowCount, column.count());

    for (int i = 5; i < maxRowCount; ++i) // rows
    {
      strList.clear();
      for (int j = 0; j < 2; ++j) // columns
      {
        if (i < dataColums[j].count())
          strList.append(QString::number(dataColums[j][i], \'f\'));


        else
          strList.append(\"\\\"\\\" \");
      }

      data << strList.join(\";\") + \"\\n\";


    }
    file.close();
  }
}

我认为此代码用于连接同一列上的所有数据。我该如何拆分它?

 data << strList.join(\",\") << \"\\n\";

这是将日志写入 csv 函数

void Logger::writeLogCSV(QStringList labelList, QList<double> dataList, bool addTime)
{
    QTextStream out(logFile);

    if (addTime)
    {
        if (csvLabelsBuffer.contains(\"time\") == false)
            csvLabelsBuffer.insert(0, \"time\");
    }

    if (labelList.count() == 0)
    {
        qDebug() << \"Empty label list - abort csv write\";
        return;
    }

    bool canAddLabel = false;
    for (auto i = 2; i < labelList.count(); ++i)
    {
        if (csvLabelsBuffer.count() == 2 || csvLabelsBuffer.contains(labelList[i]) == false)
        {
            canAddLabel = true;
            csvLabelsBuffer.append(labelList[i]);
        }
    }

    if (canAddLabel)
    {
        canAddLabel = false;

        QStringList origFile = out.readAll().split(QRegExp(\"[\\r\\n]\"), QString::SplitBehavior::SkipEmptyParts);

        for (auto i = 2; i < csvLabelsBuffer.count(); ++i)
            out << \"\\\"\" + csvLabelsBuffer[i] + \"\\t\";
        out << \"\";
       // out << \"\\n\";

        if (origFile.length() > 0)
        {
            while (origFile.first().contains(\"\\\"\"))
                origFile.removeFirst();
        }

        logFile->resize(0); // delete contents !

        for (auto i = 2; i < origFile.count(); ++i) // Start from second line (data without first line which contains labels)
            out << origFile[i] + \",\";

        return;
    }

    // add Data !
    for (auto i = 2; i < csvLabelsBuffer.count(); ++i)
    {
        out.atEnd(); // ???

        int index = labelList.indexOf(csvLabelsBuffer[i]); 
        if (index >= 0 && index < dataList.count())
            out << QString::number(dataList[index], \'f\') + \",\";
        else if (csvLabelsBuffer[i] == \"time\")
            out << QDateTime::currentDateTimeUtc().toString(\"yyyy-MM-ddTHH:MM:ss.zzzZ\") + \',\';
    }

    out << \"\\n \\n\";

}

  • 你的问题对我来说有点难以理解。
  • 抱歉,我忘了添加 csv 文件的图片。在编辑问题中
  • 无法重现(在清除它以实际使“可重现”之后)。使用示例数据QList&lt;QList&lt;double&gt;&gt; dataColums({{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}});,您的代码在第一列打印 1-5,在第二列打印 6-10(当然从 0 迭代,而不是从 5 迭代)。
  • 但是您在图片中显示的是 Excel 如何打开您的文件,可能与正确/不正确的文件内容无关(看起来不错,值以逗号分隔)。不知道为什么,也许是一些语言环境配置。无论如何,对于 excel,您还可以打开一个空白文档并使用“数据导入”功能,您可以在其中指定数据格式。
  • 我需要将逗号后的那些分配给B graph1,逗号后的应该留在A graph2中,逗号后的应该留在B中。

标签: c++ qt split export-to-csv


【解决方案1】:

您应该使用文本编辑器打开生成的文件,并将其中的一些行发布到您的答案中。通过使用 excel 打开文件,您需要设置它将用于将行拆分为列的分隔符。通常它会使用',',但有时它会默认为';'。

这将用逗号分隔它们,这是 csv 的标准:

void MainWindow::exportArraysToCSV(QStringList labelList, QList < QList < double >> dataColums, QChar sep) {
      QString filters("CSV files (*.csv);;All files (*.*)");
      QString defaultFilter("CSVi files (*.csv)");
      QString fileName = QFileDialog::getSaveFileName(0, "Save file", QCoreApplication::applicationDirPath(),
        filters, & defaultFilter);
      QFile file(fileName);
    
      if (file.open(QFile::WriteOnly | QFile::Append)) {
        QTextStream data( & file);
        QStringList strList;
    
        foreach(auto label, labelList) {
          if (label.length() > 0)
            strList.append("\"" + label + "\"");
          else
            strList.append("");
        }
    
        data << strList.join(",") << "\n";
    
        int maxRowCount = 0;
        foreach(auto column, dataColums)
        maxRowCount = qMax(maxRowCount, column.count());
    
        for (int i = 5; i < maxRowCount; ++i) // rows
        {
          strList.clear();
          for (int j = 0; j < 2; ++j) // columns
          {
            if (i < dataColums[j].count())
              strList.append(QString::number(dataColums[j][i], 'f'));
    
    
            else
              strList.append("\"\" ");
          }
    
          data << strList.join(",") + "\n";
    
    
        }
        file.close();
      }
    }

如果这不能解决您的问题,那么您需要使用文本编辑器打开您的 csv 并查看它有什么问题。然后在这里发布一些行。

【讨论】:

    猜你喜欢
    • 2015-04-19
    • 1970-01-01
    • 2019-12-05
    • 2020-09-29
    • 2017-10-25
    • 2012-07-24
    • 2021-12-15
    • 2022-11-14
    • 1970-01-01
    相关资源
    最近更新 更多