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

相关文章

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

解决Java中基于GeoTools的Shapefile读取乱码的问题

《解决Java中基于GeoTools的Shapefile读取乱码的问题》本文主要讨论了在使用Java编程语言进行地理信息数据解析时遇到的Shapefile属性信息乱码问题,以及根据不同的编码设置进行属... 目录前言1、Shapefile属性字段编码的情况:一、Shp文件常见的字符集编码1、System编码