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

16 篇文章 0 订阅
8 篇文章 0 订阅

读取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; // 是否是区分列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值