[QT]line读出来是PK\u0003\u0004\u0014

📅 2026/7/6 14:45:34
[QT]line读出来是PK\u0003\u0004\u0014
从文件中读取到的内容是PK\u0003\u0004\u0014这类字符说明你尝试读取的文件并不是 CSV 格式而是一个ZIP 压缩文件或基于 ZIP 格式的压缩包如 .docx、.xlsx、.pptx 等。原因分析PK\u0003\u0004是 ZIP 压缩文件的文件头标识由发明者 Phil Katz 的缩写 PK 加上特定二进制标记组成。当你用文本方式读取压缩文件时会将二进制数据解析为乱码字符就会出现这种结果。解决步骤确认文件格式检查你要读取的文件后缀是否为.csv。如果是.zip、.docx、.xlsx等说明文件被压缩或本身是复合文档需要先解压再读取内部的 CSV如果有的话。若文件确实是 CSV 但被误压缩先手动解压该文件如果是 ZIP 包得到真正的.csv文件后再用之前的代码读取。若文件被错误命名例如实际是压缩包却被改名为.csv需要恢复正确的后缀如.zip解压后获取内部的 CSV 数据。避免二进制文件用文本方式读取对于非文本文件如压缩包用QTextStream读取会导致乱码应使用QIODevice::ReadOnly模式配合二进制读取readAll()但这对解析 CSV 无意义需先处理文件格式问题。总结先确认文件是否为真实的 CSV 文本文件排除压缩包或二进制文件的可能性。如果是压缩包解压后再读取其中的 CSV 内容如果是文件命名错误修正后缀后重新处理。提供 一个xlsx表格 包括x和y两列数据转换为csv格式拿到两列数据存入JsonArray里面的object里面QT实现在 Qt 中处理 XLSX 文件需要借助第三方库Qt 官方未内置 XLSX 解析功能推荐使用 QXlsx 库轻量且易用。以下是完整实现流程步骤说明集成 QXlsx 库下载并配置 QXlsx 到 Qt 项目见下文配置方法。读取 XLSX 文件解析指定工作表中的x和y列数据。转换为 CSV可选可直接跳过将 XLSX 数据写入 CSV 文件如需中间文件。数据存入 JSON将x和y数据存入QJsonArray的QJsonObject中。一、QXlsx 库配置Windows 示例从 QXlsx 仓库 下载源码解压到项目目录如thirdparty/QXlsx。在 Qt 项目的.pro文件中添加配置pro# 引入QXlsx include(thirdparty/QXlsx/QXlsx.pri) # 启用C11及以上QXlsx依赖 CONFIG c11二、完整代码实现cpp#include QFile #include QJsonArray #include QJsonObject #include QJsonDocument #include QDebug #include xlsxworkbook.h // QXlsx头文件 #include xlsxworksheet.h // 从XLSX读取x和y列数据返回QVector存储的键值对 QVectorQPairdouble, double readXlsxData(const QString xlsxPath) { QVectorQPairdouble, double data; QXlsx::Document xlsx(xlsxPath); if (xlsx.isNull()) { qDebug() 无法打开XLSX文件 xlsxPath; return data; } // 获取第一个工作表可根据实际表名修改如xlsx.worksheet(Sheet1) QXlsx::Worksheet* sheet xlsx.currentWorksheet(); if (!sheet) { qDebug() 工作表不存在; return data; } // 假设第1行为表头x在A列y在B列从第2行开始读取数据 int row 2; // 起始行行号从1开始 while (true) { // 读取A列x和B列y的值 QXlsx::Cell* cellX sheet-cellAt(row, 1); // 第1列A列 QXlsx::Cell* cellY sheet-cellAt(row, 2); // 第2列B列 // 若x或y单元格为空停止读取 if (!cellX || !cellY || cellX-value().isNull() || cellY-value().isNull()) { break; } // 转换为数值支持数字或字符串形式的数字 bool xOk false, yOk false; double x cellX-value().toDouble(xOk); double y cellY-value().toDouble(yOk); if (xOk yOk) { data.append(QPairdouble, double(x, y)); } else { qDebug() 第 row 行数据转换失败; } row; } return data; } // 将数据写入CSV文件可选步骤 void writeToCsv(const QVectorQPairdouble, double data, const QString csvPath) { QFile file(csvPath); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { qDebug() 无法创建CSV文件 file.errorString(); return; } QTextStream out(file); // 写入CSV表头 out x,y\n; // 写入数据 for (const auto pair : data) { out pair.first , pair.second \n; } file.close(); qDebug() CSV文件已生成 csvPath; } // 将数据转换为QJsonArray QJsonArray convertToJson(const QVectorQPairdouble, double data) { QJsonArray jsonArray; for (const auto pair : data) { QJsonObject obj; obj[x] pair.first; obj[y] pair.second; jsonArray.append(obj); } return jsonArray; } // 示例用法 int main(int argc, char *argv[]) { // XLSX文件路径替换为实际路径 QString xlsxPath data.xlsx; // 读取XLSX数据 auto data readXlsxData(xlsxPath); if (data.isEmpty()) { qDebug() 未读取到有效数据; return -1; } // 可选转换为CSV writeToCsv(data, output.csv); // 转换为JSON数组 QJsonArray jsonArray convertToJson(data); // 打印JSON结果可选 QJsonDocument doc(jsonArray); qDebug() JSON数据\n doc.toJson(QJsonDocument::Indented); return 0; }三、XLSX 文件格式要求假设data.xlsx内容如下第 1 行为表头A 列 xB 列 y表格A 列xB 列y1.23.45.67.89.010.11四、关键说明QXlsx 兼容性支持.xlsx格式不支持旧版.xls需先转换为.xlsx。列行索引QXlsx 中列号从 1 开始A1B2...行号从 1 开始。错误处理包含文件打开失败、单元格为空、数值转换失败等场景的判断。JSON 结构最终生成的 JSON 数组格式为json[ {x: 1.2, y: 3.4}, {x: 5.6, y: 7.8}, {x: 9.0, y: 10.11} ]如需处理复杂 XLSX 格式如合并单元格、不同工作表可扩展readXlsxData函数中工作表和单元格的读取逻辑。