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

相关文章

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

使用zabbix进行监控网络设备流量

《使用zabbix进行监控网络设备流量》这篇文章主要为大家详细介绍了如何使用zabbix进行监控网络设备流量,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装zabbix配置ENSP环境配置zabbix实行监控交换机测试一台liunx服务器,这里使用的为Ubuntu22.04(

使用Python处理CSV和Excel文件的操作方法

《使用Python处理CSV和Excel文件的操作方法》在数据分析、自动化和日常开发中,CSV和Excel文件是非常常见的数据存储格式,ython提供了强大的工具来读取、编辑和保存这两种文件,满足从基... 目录1. CSV 文件概述和处理方法1.1 CSV 文件格式的基本介绍1.2 使用 python 内

在Pandas中进行数据重命名的方法示例

《在Pandas中进行数据重命名的方法示例》Pandas作为Python中最流行的数据处理库,提供了强大的数据操作功能,其中数据重命名是常见且基础的操作之一,本文将通过简洁明了的讲解和丰富的代码示例,... 目录一、引言二、Pandas rename方法简介三、列名重命名3.1 使用字典进行列名重命名3.编

python安装完成后可以进行的后续步骤和注意事项小结

《python安装完成后可以进行的后续步骤和注意事项小结》本文详细介绍了安装Python3后的后续步骤,包括验证安装、配置环境、安装包、创建和运行脚本,以及使用虚拟环境,还强调了注意事项,如系统更新、... 目录验证安装配置环境(可选)安装python包创建和运行Python脚本虚拟环境(可选)注意事项安装

Java读取InfluxDB数据库的方法详解

《Java读取InfluxDB数据库的方法详解》本文介绍基于Java语言,读取InfluxDB数据库的方法,包括读取InfluxDB的所有数据库,以及指定数据库中的measurement、field、... 首先,创建一个Java项目,用于撰写代码。接下来,配置所需要的依赖;这里我们就选择可用于与Infl

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加