C读取CSV文件,通过某种条件,按照特定行和同一列进行读取

2023-12-06 08:28

本文主要是介绍C读取CSV文件,通过某种条件,按照特定行和同一列进行读取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

读取CSV文件,按照特定行和列进行读取

1、source

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <wchar.h>
#include <locale.h>#define MAX_LINE_LENGTH 1000
#define MAX_COLUMNS 50// 函数声明
int findTargetColumn(wchar_t* line);
void getColumnValue(wchar_t* line, int target_column, wchar_t* columnValue);void process_block(FILE* file) {int is_data_block_1 = 0; // 是否是区分列为1的数据块int is_data_block_0 = 0; // 是否是区分列为0的数据块int target_column = -1;  // 带●的列号int columnNums = 0;wchar_t buffer[MAX_LINE_LENGTH];wchar_t saved_column[MAX_COLUMNS];  // 保存当前列号wchar_t columnValueDif0[MAX_LINE_LENGTH];   //根据列下标确定的区分0的值// 读取一行数据while (fgetws(buffer, sizeof(buffer) / sizeof(buffer[0]), file) != NULL) {// 去掉换行符wchar_t* newline = wcschr(buffer, L'\n');if (newline) {*newline = L'\0';}// 如果遇到#开头的行,跳过if (buffer[0] == L'#') {continue;}// 如果遇到空行,说明数据块结束,重置标志if (buffer[0] == L'\0') {is_data_block_1 = 0;target_column = -1;continue;}// 判断是否是区分列为1的数据块int col_number = 0;wchar_t* token = buffer;// 找第二列while (*token && col_number < 1) {if (*token == L',') {col_number++;}token++;}// 如果第二列为 "1"if (col_number == 1 && ((*token) == L'1')) {is_data_block_1 = 1;}if (is_data_block_1 == 1) {while (*token) {if (*token == L',') {col_number++;}else if (*token == L'●') {//如果有带符号●的wchar_t* symbolPos = wcschr(token,',');if (symbolPos != NULL) {*symbolPos = L'\0';wchar_t* temp = token + 1;*symbolPos = L',';			// 还原原始数据//一共三种方式,还有wcsncpy:wchar_t* temp2 = symbolPos;wchar_t data1[MAX_LINE_LENGTH];wchar_t data2[MAX_LINE_LENGTH];memcpy(data1, token+1, temp2 - token);int len = (temp2 - token) / sizeof(wchar_t);data1[len] = '\0';wcsncpy(data2, token + 1, temp2 - token);data2[len] = '\0';}else if (symbolPos == NULL) {		//最后一列,后面没有逗号wchar_t* temp = token + 1;}saved_column[columnNums++] = col_number;}token++;}}//如果区分块是0的场合if (col_number == 1 && ((*token) == L'0')) {is_data_block_0 = 1;}if (is_data_block_0 == 1) {for (int i = 0; i < columnNums; i++) {int columnNum = saved_column[i];getColumnValue(buffer, columnNum, columnValueDif0);}}// 重置标志is_data_block_1 = 0;target_column = -1;}
}// 辅助函数:寻找带●的那一列的列号
int findTargetColumn(wchar_t* line) {int col_number = 0;wchar_t* token = line;while (*token) {if (*token == L',') {col_number++;}else if (*token == L'●') {return col_number;}token++;}return -1; // 未找到
}// 辅助函数:根据列号获取对应的列值
void getColumnValue(wchar_t* line, int target_column, wchar_t* columnValue) {wchar_t* token = line;int col_number = 0;// 遍历列,找到对应的列值while (*token) {if (*token == L',') {col_number++;}else if (col_number == target_column) {// 将一行的值拆分成数组wchar_t* start = token;while (*token && *token != L',') {token++;}// 拷贝列值到 columnValuewcsncpy(columnValue, start, token - start);columnValue[token - start] = L'\0'; // 手动添加 null 终止符return;}token++;}
}int main() {setlocale(LC_ALL, "");  // 设置本地化,以便支持宽字符FILE* file = fopen("D:\\vs2019C++practise\\YoutubeC\\source\\Test\\CF.csv", "r, ccs=UTF-8");  // 以UTF-8编码方式打开文件if (file == NULL) {perror("Error opening file");return 1;}// 逐行读取文件并处理数据块process_block(file);fclose(file);return 0;
}

2、可以用的方法

#include <stdio.h>
#include <wchar.h>
#include <locale.h>#define MAX_LINE_LENGTH 1000// 辅助函数:寻找带●的那一列的列号
int findTargetColumn(wchar_t *line) {int col_number = 0;wchar_t *token = line;while (*token) {if (*token == L',') {col_number++;} else if (*token == L'●') {return col_number;}token++;}return -1; // 未找到
}void process_block(FILE *file) {int is_data_block_1 = 0; // 是否是区分列

这篇关于C读取CSV文件,通过某种条件,按照特定行和同一列进行读取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/461134

相关文章

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

MySQL按时间维度对亿级数据表进行平滑分表

《MySQL按时间维度对亿级数据表进行平滑分表》本文将以一个真实的4亿数据表分表案例为基础,详细介绍如何在不影响线上业务的情况下,完成按时间维度分表的完整过程,感兴趣的小伙伴可以了解一下... 目录引言一、为什么我们需要分表1.1 单表数据量过大的问题1.2 分表方案选型二、分表前的准备工作2.1 数据评估

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

MySQL进行分片合并的实现步骤

《MySQL进行分片合并的实现步骤》分片合并是指在分布式数据库系统中,将不同分片上的查询结果进行整合,以获得完整的查询结果,下面就来具体介绍一下,感兴趣的可以了解一下... 目录环境准备项目依赖数据源配置分片上下文分片查询和合并代码实现1. 查询单条记录2. 跨分片查询和合并测试结论分片合并(Shardin

Linux从文件中提取特定内容的实用技巧分享

《Linux从文件中提取特定内容的实用技巧分享》在日常数据处理和配置文件管理中,我们经常需要从大型文件中提取特定内容,本文介绍的提取特定行技术正是这些高级操作的基础,以提取含有1的简单需求为例,我们可... 目录引言1、方法一:使用 grep 命令1.1 grep 命令基础1.2 命令详解1.3 高级用法2

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

基于Python Playwright进行前端性能测试的脚本实现

《基于PythonPlaywright进行前端性能测试的脚本实现》在当今Web应用开发中,性能优化是提升用户体验的关键因素之一,本文将介绍如何使用Playwright构建一个自动化性能测试工具,希望... 目录引言工具概述整体架构核心实现解析1. 浏览器初始化2. 性能数据收集3. 资源分析4. 关键性能指