当前位置: 首页 > news >正文

[C语言]Excel转换JsonObject

要在 C 语言中实现将 Excel 的两列数据(x 和 y)读取并存储到 JSON 数组(JsonArray)的对象中,需分两步:解析 Excel 文件获取 x 和 y 数据构建 JSON 结构存储数据。以下是具体实现方案:

前提说明

  1. Excel 文件解析:C 语言无内置 Excel 解析库,需借助轻量级库如libxlsxwriter(读 / 写.xlsx)或libxls(读.xls)。本文以libxls为例解析.xls 文件。
  2. JSON 构建:使用 C 语言 JSON 库cJSON(轻量、易用)构建JsonArray,每个元素为包含"x""y"JsonObject

环境准备

  • 安装libxls(解析.xls):sudo apt-get install libxls-dev(Linux)或从源码编译。
  • 下载cJSON库:从GitHub获取cJSON.ccJSON.h,加入项目。

实现代码

c

#include <stdio.h> #include <stdlib.h> #include <string.h> #include "xls.h" // libxls头文件 #include "cJSON.h" // cJSON头文件 // 从Excel读取x和y列数据,存入JSON数组 cJSON* excelToJson(const char* excelPath) { xlsWorkBook* pWorkbook = xls_open(excelPath, "UTF-8"); // 打开Excel文件 if (pWorkbook == NULL) { printf("无法打开Excel文件: %s\n", excelPath); return NULL; } xlsWorkSheet* pWorksheet = xls_getWorkSheet(pWorkbook, 0); // 获取第一个工作表 if (pWorksheet == NULL) { printf("获取工作表失败\n"); xls_close(pWorkbook); return NULL; } xls_parseWorkSheet(pWorksheet); // 解析工作表 // 创建JSON数组(存储所有x,y对象) cJSON* jsonArray = cJSON_CreateArray(); if (jsonArray == NULL) { printf("创建JSON数组失败\n"); xls_close_WS(pWorksheet); xls_close(pWorkbook); return NULL; } // 假设Excel第一行为表头("x"和"y"),从第二行开始读取数据(行索引从0开始) int startRow = 1; // 数据起始行(跳过表头) int maxRow = pWorksheet->rows.lastrow; // 最大行索引 int xCol = 0; // x列索引(假设第一列,0-based) int yCol = 1; // y列索引(假设第二列,0-based) for (int row = startRow; row <= maxRow; row++) { // 获取当前行的x和y单元格数据 xlsCell* xCell = xls_cell(pWorksheet, row, xCol); xlsCell* yCell = xls_cell(pWorksheet, row, yCol); // 跳过空行(x或y为空则跳过) if (xCell == NULL || yCell == NULL || xCell->str == NULL || yCell->str == NULL) { continue; } // 创建JSON对象,存储x和y cJSON* jsonObj = cJSON_CreateObject(); cJSON_AddStringToObject(jsonObj, "x", xCell->str); // 假设x为字符串,如需数值用cJSON_AddNumberToObject cJSON_AddStringToObject(jsonObj, "y", yCell->str); // 假设y为字符串,同理可改为数值 // 将对象添加到JSON数组 cJSON_AddItemToArray(jsonArray, jsonObj); } // 释放资源 xls_close_WS(pWorksheet); xls_close(pWorkbook); return jsonArray; } int main() { const char* excelPath = "data.xls"; // Excel文件路径 cJSON* jsonArray = excelToJson(excelPath); if (jsonArray == NULL) { return 1; } // 打印JSON结果(可选) char* jsonStr = cJSON_Print(jsonArray); if (jsonStr != NULL) { printf("JSON结果:\n%s\n", jsonStr); free(jsonStr); // 释放cJSON_Print分配的内存 } // 释放JSON数组 cJSON_Delete(jsonArray);

在 C 语言中,由于其底层特性和丰富的库支持,能够解析多种类型的文件,具体取决于使用的库和实现方式。以下是 C 语言常见的可解析文件类型及对应的解析方式:

1.文本文件(.txt、.csv、.log 等)

  • 特点:由 ASCII 或 UTF-8 等编码的字符组成,结构简单,可直接按行或按字符读取。
  • 解析方式:利用标准库函数(fopenfgetsfscanf等)逐行读取,通过字符串处理函数(strtokstrstrsscanf等)分割内容。
    • 例如解析 CSV 文件(逗号分隔):用fgets读取一行,再用strtok按逗号分割字段。
    • 示例场景:日志文件分析、配置文件(如.ini)解析。

2.二进制文件(.bin、.dat 等)

  • 特点:按字节存储数据,通常是自定义格式(如结构体序列化后的文件),需按固定格式解析。
  • 解析方式:用fread按字节读取,通过结构体指针映射数据。例如:

    c

    typedef struct { int id; float value; char name[20]; } Data; Data d; FILE* f = fopen("data.bin", "rb"); fread(&d, sizeof(Data), 1, f); // 直接读取结构体
    需知道文件的二进制布局(字段类型、顺序、大小端等)。

3.结构化文本文件(.xml、.json 等,需第三方库)

  • XML:可通过libxml2库解析,支持 DOM(文档对象模型)或 SAX(事件驱动)方式,适合处理标签化结构的文件。
  • JSON:借助cJSONjson-c等轻量库,可解析 JSON 对象、数组,支持增删改查节点,常用于数据交换格式解析。

4.表格文件(.xls、.xlsx,需特定库)

  • .xls(Excel 97-2003):可用libxls库解析,读取工作表、行、单元格数据(文本、数值等),支持提取单元格内容和格式信息。
  • .xlsx(Excel 2007+):基于 OOXML 格式(ZIP 压缩的 XML 集合),需结合libzip解压,再用libxml2解析内部...

以下是使用 C++ 实现读取 CSV 文件中 x 和 y 列数据,并存储为 JSON 数组(每个对象包含 x 和 y 字段)的示例代码。代码依赖nlohmann/json库(轻量级 JSON 库)和 C++11 及以上标准:

实现步骤

  1. 读取 CSV 文件,解析 x 和 y 列数据;
  2. 将每对 (x, y) 封装为 JSON 对象;
  3. 所有对象存入 JSON 数组并输出。

代码实现

cpp

#include <iostream> #include <fstream> #include <sstream> #include <string> #include "nlohmann/json.hpp" // 引入nlohmann/json库 using json = nlohmann::json; using namespace std; // 从CSV文件读取x和y列,返回JSON数组 json csvToJsonArray(const string& csvPath) { json jsonArray = json::array(); // 定义JSON数组 ifstream file(csvPath); if (!file.is_open()) { cerr << "无法打开CSV文件: " << csvPath << endl; return jsonArray; } string line; // 跳过CSV表头(假设第一行为列名"x,y") getline(file, line); // 逐行解析CSV内容 while (getline(file, line)) { stringstream ss(line); string xStr, yStr; // 分割x和y字段(假设用逗号分隔) if (getline(ss, xStr, ',') && getline(ss, yStr, ',')) { try { // 转换为数值类型(根据实际需求可改为字符串) double x = stod(xStr); double y = stod(yStr); // 创建包含x和y的JSON对象,添加到数组 json obj; obj["x"] = x; obj["y"] = y; jsonArray.push_back(obj); } catch (const exception& e) { cerr << "解析CSV行失败: " << line << ",错误: " << e.what() << endl; continue; } } } file.close(); return jsonArray; } int main() { // 示例:处理包含x和y列的CSV文件 string csvPath = "data.csv"; // CSV文件路径 json result = csvToJsonArray(csvPath); // 输出JSON数组(格式化打印) cout << "JSON数组结果:\n" << result.dump(4) << endl; return 0; }

依赖与编译

  1. 依赖库:需下载nlohmann/json库(单头文件json.hpp),无需编译,直接包含即可。下载地址:https://github.com/nlohmann/json

  2. 编译命令:假设代码文件为csv2json.cpp,编译命令:

    bash

    g++ -std=c++11 csv2json.cpp -o csv2json

说明

  • 代码假设 CSV 文件格式为:第一行为表头(x,y),后续每行格式为数值,数值(如1.2,3.4)。
  • 如需处理字符串类型的 x/y 数据,可移除stod转换,直接存储字符串到 JSON 对象。
  • 异常处理部分可根据需求扩展(如处理空值、格式错误等)。

运行后,CSV 中的 x 和 y 数据将被封装为 JSON 数组,例如:

json

[ {"x": 1.5, "y": 2.8}, {"x": 3.2, "y": 4.1} ]
http://www.jsqmd.com/news/1119422/

相关文章:

  • 《Java 100 天进阶之路》第50篇:阻塞队列与并发容器(2026版)
  • C4模型中的Level 1(System Context Diagram,系统上下文图)是C4模型最顶层的抽象视图
  • Code Combat | 极客战记 攻略【Kithgard地牢篇 14/42】祸之火焰
  • 模型训练后的第一件事?微调?NO
  • 中文科研写作AI工具实测:秘塔、Kimi、Qwen2-72B三大断点解决方案
  • 终极E-Hentai下载器指南:5分钟掌握画廊批量打包技巧
  • 查询服务器RAID卡-lspci命令
  • 看懂特斯拉IMU底层逻辑,才懂农业机器人不可替代的核心技术壁垒
  • ComfyUI IPAdapter plus高级配置实战:5大策略深度解析多模型协同工作流
  • 基于CNN卷积神经网络手写汉字识别系统 (GUI界面)【源码38期】
  • 2014-2024 接受关联公司担保次数企业间信任水平数据+代码文献
  • 体验家 XMPlus 数据分析引擎深度解析:交叉分析、趋势对比与智能下钻
  • 手把手教你学 Simulink——输送带多电机驱动的转速同步与主从控制(Droop / 带载分配)仿真
  • PMSM电流环控制原理与工程实践
  • [C语言]Excel转换CSV的正确方式
  • GPTPlus个人版与team企业版核心差异深度解析
  • E-Hentai下载器终极指南:免费打包画廊图片的完整教程
  • 深度学习中的反向传播和梯度下降
  • 如何快速掌握S32K144车规级MCU开发:完整实战指南
  • Windows 11安卓子系统(WSA)终极安装配置指南:从零到精通
  • 编译原理:编译过程
  • PCB阻抗设计实战:4层板50Ω单端线宽计算与SI9000参数配置
  • 主板怎么选:从AM5新装机到AM4焕新,一次讲透怎么买
  • Avalonia 跨平台升级、安装包
  • 2026异构计算决胜关键:赋能高端硬件的MPSoC方案全解析
  • E-Hentai下载器终极指南:3分钟学会免费批量下载画廊
  • DVWA从入门到精通(七):Insecure CAPTCHA(不安全的验证码)
  • 无传感器控制技术在PMSM电机中的应用与优化
  • 基于 Simulink 的基于滑模变结构控制(SMC)的港口起重机防摇摆控制仿真实战教程
  • 3分钟搞定E-Hentai画廊下载:零基础免费打包完整指南