C读取CSV文件,通过某种条件,按照特定行和同一列进行读取
2023-12-14 03:57:40
读取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++;
}
// 拷贝列值到 columnValue
wcsncpy(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; // 是否是区分列
文章来源:https://blog.csdn.net/weixin_45864704/article/details/134820937
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!