linux-Ubuntu server输出.csv文件方法 小结

2023-05-16

导语:

  在ARM上或在其他芯片上做开发,有时候会有这样的需求,将你工控机、开发板或者你的设备采集出来的数据做成一个exc列表;最简单的方式就是用数据直接输出为.txt文件,但是这样并不方便wps或者Excel表格打开;

常用的一个方式就是生成.csv文件;这是大多数上位机采取的一种数据存根的方式;对某些场合的使用是非常便利!

接下来总结在ARM板上实现的,对数据生成.csv的操作;其他的平台,方式类同;

1.csv文件生成接口

普及一下:.csv文件格式要求--百度百科https://baike.baidu.com/item/CSV/10739?fr=aladdin

/root__/business   (代码位置)
       |__/flow        (流水位置-有coout索引和.csv文件)

操作过程,一完整的数据到了,先查询上次写入到哪一个文件哪一条流水,比如是第1个文件的第100条(最大数),此次立马写入第2个文件第一条(第0条并补上第0条的标题);如果写到第1个文件的第23条,那么该次流水应该写第1个文件的第24条(不需要补充标题);写完后里面更新文件和流水索引--以便下次查询;

/****************************************************
* 函数名:create_flow
* 功能描述:生成流水
* 输入参数:流水原始的数据
* 输出参数:
* 返回值:
* 备注:
****************************************************/
void VCBusiness::create_flow(const OBU_OBJECT_STRU *obu_object) {
    if (NULL == obu_object) {
        LOG_ERROR("func:%s : 指针为NULL", __func__);
        return;
    }

    u16 file_index = 0, flow_index = 0;
    char file_name[64] = {0};
    string write_str;
    char write_head[1024] = {0};
    char temp[32] = {0};
    FILE *fp = NULL;
    u16 trans_time = GET_INTERVAL_TIME(obu_object->life_time);
    /* 获取索引 */
    get_flow_file_index(&flow_index, &file_index);
    /* 根据索引指定记录文件 */
    sprintf(file_name, "/root/flow/flow_file_%05d.csv", file_index);
    /* 打开记录文件 */
    fp = fopen(file_name, "a+");
    if (NULL == fp) {
        LOG_WARN("[%s]打开文件失败", __func__);
        return;
    }
    /* 未记录过文件 */
    if (0 == flow_index) {
        //sprintf(write_head, "TransResult,ErrorCode,TransTime,TAC,PSAMTradeNum,FlagNo,RsuNo,DevType,ObuId,OBUProvider,ContractType,CPC EF02,OBUSerialNum,OBUStartTime,OBUEndTime,OBUStatus,VehClass,VehPlate,VehPlateColor,CardProvider,CPUCardType,CardVersion,CardNetWork,CardId,CardStartTime,CardEndTime,TerminalId,TotalTime\n");
        sprintf(write_head, "TransResult,ErrorCode,TransTime,TAC,PSAMTradeNum,FlagNo,RsuNo,DevType,ObuId,OBUProvider,E-WalletTradeNum ,CPC EF02,OBUSerialNum,OBUStartTime,OBUEndTime,OBUStatus,VehClass,VehPlate,VehPlateColor,CardProvider,CPUCardType,CardVersion,CardNetWork,CardId,CardStartTime,CardEndTime,TerminalId,TotalTime\n");
        fwrite(write_head, sizeof(char), strlen(write_head), fp);
    }
	/********************开始组.csv文件内容**********************************************************************/
    bytes_to_hex_string(&write_str, &obu_object->transresult, 1);			//保存原来的16进制,直接写入
		......
    //bytes_to_hex_string(&write_str, obu_object->obu_flow_info.vehicle_info_stru.VehicleLicencePlateColor_Pack, 2);
    memcpy(temp, obu_object->obu_flow_info.vehicle_info_stru.VehicleLicencePlateColor_Pack, 2);//对hex转ascii,汉字写入
    write_str.append(temp, 2);
	memset(temp, 0, sizeof(temp));
    sprintf(temp, ",");  write_str.append(temp);
		......
    /* CardEndTime */
    bytes_to_hex_string(&write_str, obu_object->obu_flow_info.iccard_info_stru.issuerinfo + 24, 4);
    /* TerminalId */
    bytes_to_hex_string(&write_str, obu_object->obu_flow_info.trade_info_stru.TerminalID, 6);
    /* TotalTime */
    sprintf(temp, "%08x\n", trans_time);//最后一个变量,不需要补逗号,直接追加打印
    write_str.append(temp);
	/*******************组.csv文件内容结束***********************************************************************/
    /* 写入文件 */
    fwrite(write_str.c_str(), sizeof(char), write_str.length(), fp);
    fclose(fp);
    /* 更新索引 */
    if (flow_index >= FLOW_COUNT_PER_FILE_MAX) {
        flow_index = 0;
        file_index++;
    } else {
        flow_index++;
    }
    set_flow_file_index(flow_index, file_index);
}

2.开头的查询和结尾的更新索引操作

/****************************************************
* 函数名:get_flow_file_index
* 功能描述:获取流水数据的存储索引
* 输入参数:
* 输出参数:file_index-当前流水文件索引, flow_index-单个文件流水索引
* 返回值:
* 备注:避免单文件太大,所以会生成多个文件,故有文件索引号1,2,3,4...
* 备注:为方便浏览和传输,每个文件都存100条流水,故流水索引号1,2..100
****************************************************/
bool VCBusiness::get_flow_file_index(u16 *flow_index, u16 *file_index) {
    system("touch /root/flow/countor");//创建文件的个数,为避免单个文件太大
    /* 流水文件编号 */
    auto file_count = ConfDataParsor::GetValue("FILE_COUNT", flow_countor_path);
    if (!file_count.success) {
        *file_index = 0;
		LOG_DEBUG("[%s][%d]", __func__, __LINE__);
    } else {
        *file_index = atoi(file_count.data);//获得上次最新的文件索引
    }
    /* 流水编号 */
    auto flow_count = ConfDataParsor::GetValue("FLOW_COUNT", flow_countor_path);
    if (!flow_count.success) {
        *flow_index = 0;
		LOG_DEBUG("[%s][%d]", __func__, __LINE__);
    } else {
        *flow_index = atoi(flow_count.data);//获得上次产生的最新的流量序号,100条流水打包为一个文件
    }
}
/****************************************************
* 函数名:set_flow_file_index
* 功能描述:设置流水存储索引
* 输入参数:file_index-流水文件索引, flow_index-单个文件流水索引
* 输出参数:
* 返回值:
* 备注:
****************************************************/
void VCBusiness::set_flow_file_index(u16 flow_index, u16 file_index) {
    system("touch /root/flow/countor");

    /* 流水文件编号 */
    if (false == ConfDataParsor::SetValue("FILE_COUNT", flow_countor_path, file_index)) {
        LOG_WARN("[%s]设置流水文件编号失败", __func__);
    }
    /* 文件内流水编号 */
    if  (false == ConfDataParsor::SetValue("FLOW_COUNT", flow_countor_path, flow_index)) {
        LOG_WARN("[%s]设置流水编号失败", __func__);
    }
}

3.中间的的数据存储说明

//如果是16进制-hex追加的话可以用sprintf(temp, "%02x", data[i]);string->append(temp);
//如果需要追加汉字则需要,sprintf(temp,"黄色");再追加string->append(temp);
//追加逗号是.csv的文件要求
void VCBusiness::bytes_to_hex_string(string *string, const u8 *data, u16 len) {
    char temp[10] = {0};
    for (int i = 0; i < len; ++i) {
        sprintf(temp, "%02x", data[i]);
        string->append(temp);
    }
    sprintf(temp, ",");
    string->append(temp);
}

4.最后用wps或excel打开的效果如图-供参考

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux-Ubuntu server输出.csv文件方法 小结 的相关文章

  • 使用 inotify 的正确方法是什么?

    我想使用inotifyLinux 上的机制 我希望我的应用程序知道文件何时aaa被改变了 您能给我提供一个如何做到这一点的示例吗 文档 来自监视文件系统活动 inotify https developer ibm com tutorials
  • rustup install stable 下载过程中出现错误

    我使用命令安装 Rust curl sSf https static rust lang org rustup sh sh 当我跑步时 rustc main rs 这出现了 error no default toolchain config
  • 使用字符串数组在 Hive 表上加载 CSV 文件

    我正在尝试将 CSV 文件插入 Hive 其中一个字段是 string 数组 这是 CSV 文件 48 Snacks that Power Up Weight Loss Aidan B Prince Health Fitness Trave
  • 如何使用 echo 写入非 ASCII 字符?

    如何写非ASCII http en wikipedia org wiki ASCII使用 echo 的字符 是否有转义序列 例如 012或类似的东西 我想使用以下方法将 ASCII 字符附加到文件中 echo gt gt file 如果您关
  • pprof 和 ps 之间的内存使用差异

    我一直在尝试分析用 cobra 构建的 cli 工具的堆使用情况 这pprof工具显示如下 Flat Flat Sum Cum Cum Name Inlined 1 58GB 49 98 49 98 1 58GB 49 98 os Read
  • C - 为什么我无法映射较小(256UL 或更小)的内存?

    请告诉我 为什么我的简单应用程序无法映射较小的内存 而且 为什么有这样一个特定的边界 257UL define MAP SIZE 256UL or below fail define MAP SIZE 257UL ok include
  • 当隐含 ID 列时,如何合并 csv 文件中的多个数据框?

    我想将一堆数据框合并在一起 因为如果您只处理一个数据框 则许多操作似乎会更容易 但如果我错了 请纠正我 目前我有一个像这样的数据框 ID var1 var2 A 2 2 B 4 5 Z 3 2 每个 ID 位于单行上 并带有多个单个测量值
  • 推荐用于小型站点的 IRC 服务器 (ircd)? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 情况 我想使用 IRC 机器人作为我正在研究的其他代码的通用通信接口 服务器硬件陈旧且内存不足 但运行在相对最新的 Debian GNU
  • 从 php/linux 获取 pdf 的布局模式(横向或纵向)

    给定一个 PDF 如何使用 PHP lib 或 Linux 命令行工具获取 PDF 的布局模式 或相对宽度 高度 Using http www tecnick com public code cp dpage php aiocp dp tc
  • 查看 Linux 上的多核或多 CPU 利用率

    我有一个在 Linux 上运行的程序 我需要确定它如何利用所有 CPU 内核 有没有什么程序可以查看这些信息 跑过 top 命令并按下 1 查看各个核心
  • 运行此处编译的 C 程序会导致在另一台服务器上找不到 GLIBC 库错误 - 是我的错还是他们的错?

    此处编译的 C 程序在我们的 Ubuntu 服务器上运行良好 但是当其他人尝试在他们的特定 Linux 服务器上运行它时 他们会收到以下错误 myprog install lib tls libc so 6 version GLIBC 2
  • 用于读取文件的 Bash 脚本

    不知道为什么最后一行没有从脚本中删除 bin bash FILENAME 1 while read line do cut d f2 echo line done lt FILENAME cat file 1 test 2 test 3 t
  • 带有未转义引号的Java CSV解析器[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 Linux/OS X 上温和地终止 Firefox 进程

    我正在使用 Firefox 进行一些自动化操作 尽管我可以从 shell 打开 Firefox 窗口 但我无法正确终止它 如果我kill火狐进程与kill 3 or kill 2当我下次打开新的 Firefox 窗口时 命令会询问我是否要在
  • 使用 py2neo 从 csv 文件创建 neo4j 图形数据库

    我目前正在攻读博士课程 并且对 Py2neo 很感兴趣 因此我使用它来使用社交图谱进行一些实验 然而我遇到了新手麻烦 抱歉问这些简单的问题 我得到了一个 xml 数据集 其中包含有关期刊出版物的数据 我已将其转换为 csv 表 大约有 70
  • SMP 上如何处理中断?

    SMP 对称多处理器 多核 机器上如何处理中断 内存管理单元是只有一个还是多个 假设两个线程 A 和 B 运行在不同的内核上 同时 访问页表中不存在的内存页面 在这种情况下 将会出现页面错误 并从内存中引入新页面 将会发生的事件的顺序是什么
  • 如何列出 nginx 中的所有虚拟主机

    有没有一个命令可以列出 CentOS 上 nginx 下运行的所有虚拟主机或服务器 我想将结果通过管道传输到文本文件以用于报告目的 我正在寻找与我用于 Apache 的命令类似的命令 apachectl S 2 gt 1 grep 端口 8
  • 提高mysql导入速度[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一个很大的数据库22GB 我曾经用过进行备份mysqldumpgzip 格式的命令 当我提取 gz 文件时 它会生成 sql文件的
  • 为什么默认情况下不启用 arp 忽略/通告 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个需要经验才能回答的具体问题 为什么 arp ignore arp announce 在 Linux 安装 例如 debian 上默认不启用 有
  • 运行 shell 命令并将输出发送到文件?

    我需要能够通过 php 脚本修改我的 openvpn 身份验证文件 我已将我的 http 用户设置为免通 sudoer 因为这台机器仅在我的家庭网络中可用 我目前有以下命令 echo shell exec sudo echo usernam

随机推荐

  • 智能卡操作(非接触CPU卡又称智能卡) 总结

    1 数据传输格式和初始化 对于刚接触智能卡的工程师来说 xff0c 在阅读7816 3规范的时候 xff0c 常常被其中的一些术语迷惑 xff0c 读起来会觉得有些别扭 尤其是在看到复位应答中的F和D设置以及对应的etu的时候 xff0c
  • 国密PSAM卡与CPU(用户卡)操作过程 小结

    1 终端 43 PSAM 43 CPU用户卡 常规的操作过程 PSAM 卡是作为秘密密钥的载体 xff0c 专门执行加密和数字签名等任务 xff1b 所有它常常跟一个MCU或者终端设备组在一起构成一个整体 xff1b CPU用户卡作为一个从
  • maven仓库更换为阿里的仓库同时更换插件和依赖

    span class token generics function span class token punctuation lt span repositories span class token punctuation gt spa
  • 5.8G公路协议开发 小结1

    5 8G高速公路协议开发 小结 1 5 8G高速公路协议 xff08 1 xff09 高速公路的标识点天线协议 xff08 简称自由流协议 自由流收费指的是在行车的过程中不知不觉就收取了一定的费用 在收费点的时候我们再也不用停车等待缴费 x
  • BUG小结之-网络编程的通讯问题回顾

    问题 代码和驱动确定无误 xff0c 但是无法正常收发信息 xff1b 现象 xff1a 1 UDP可以正常收数据 xff08 经过打印验证过了 xff09 xff0c 但是无法发回网口助手 xff1b 2 网络调试助手无法自动寻找和映射i
  • bug-make绝对路径相对路径-flage

    绝对路径变相对路径
  • linux网络通讯的虚拟IP的开发设计(双IP的开发)

    虚拟IP 即在一个物理IP xff08 比如这个IP为192 168 2 29 xff09 的基础上 xff0c 绑定其他的IP xff08 比如192 168 1 xxx xff09 xff0c 用windows的话说 xff0c 就是为
  • linux UDP通讯的地址选择-flag

    单播和广播的设定 UDP通讯总结可以参考链接 https blog csdn net xiaoxilang article details 80839797
  • linux-Ubuntu安装后续工作小结-flag

    flage目的 xff1a 1 由于操作不熟练 xff0c 被某人鄙视了一次 2 常温习 xff0c 防遗忘 xff0c 快速解决 xff0c 提高效率 1 安装Ubuntu xff08 1 xff09 制作ubuntu启动U盘 制作用ru
  • RemoteFX usb设备重定向-USB虚拟机重映射

    1 usb设备重定向 实现的效果 xff0c 如图1 各种usb 串口 视频usb 打印机 xff01 xff01 如果你参考我的资料 xff0c 依然不能解决问题 xff0c 可以参考博客 xff1a https yq aliyun co
  • shell编程、ssh-root量产、ping-IP脚本操作 问题-flag

    1 su root Authentication failure问题的解决 su su root 命令不能切换root xff0c 提示su Authentication failure 只要你sudo passwd root过一次之后 x
  • linux编译器的下关于gcc、g++、make和CMake几个概念的区别

    1 什么是gcc g 43 43 首先说明 xff1a gcc 和 GCC 是两个不同的东西 GCC GNU Compiler Collection GUN编译器集合 xff0c 它可以编译C C 43 43 JAV Fortran Pas
  • linux-vim编辑工具的基础的常用操作 小结

    1 设置行号 xff08 临时设置和永久性设置 xff09 临时设置 如果要显示该文件的所有行号 xff0c 则需要在vim的命令模式下输入 set nu 设置显示行号 xff0c 等同setnumber set nonu xff08 取消
  • 内网离线安装vscode插件

    一 官网下载vscode安装包 xff08 https code visualstudio com xff09 下载之后将安装包拷贝到需要的电脑进行安装并创建桌面快捷方式 二 vscode插件官网 xff08 https marketpla
  • usb/uart转网口模块选型设计 小结

    选型原则 通讯速率尽量可能快 xff0c 工作温度必须是工业级的 xff0c 成本尽量可能低 xff1b 保证用户可操作空间较大 1usb转网口 AX88772BLI xff0c ZLAN1003 xff0c IP101GRI xff08
  • Git bash基础操作指令 小结

    1 常用git指令 git的安装配置 xff08 只有初次使用需要配置 xff09 用户名和邮件 git config global user name 34 noxue 34 git config global user email ad
  • linux-ARM开发板--嵌入式开发平台-选型

    最近有一个项目以前一直在用工控机实现 xff0c 现在需要优化功能 缩减成本 xff0c 故有寻找linux ARM开发板的需求 xff1b 后期有很大可能还会自己会画PCB板 内核裁剪等设计的需求 xff1b 1 根据需求 xff0c 限
  • linux 线程与进程 -2-多线程应用编程

    多线程的管理 多线程的互斥锁和条件变量的使用 xff01 什么是进程 进程 xff08 process xff09 是一个已经开始执行但还没终止的程序实例 Linux系统下使用ps 命令可以查看到当前正在执行的进程 每个进程包含有进程运行环
  • 基于ARM开发板或linux工控机的远程操作的小结

    需求 xff1a xff08 1 xff09 黑龙江现场A处有一个一直在执行任务的工控机 xff08 或ARM板 xff09 xff0c 该板子处在一个局域网192 xxx 2 1网段 xff0c 局域网可以联网 xff1b xff08 2
  • linux-Ubuntu server输出.csv文件方法 小结

    导语 xff1a 在ARM上或在其他芯片上做开发 xff0c 有时候会有这样的需求 xff0c 将你工控机 开发板或者你的设备采集出来的数据做成一个exc列表 xff1b 最简单的方式就是用数据直接输出为 txt文件 xff0c 但是这样并