读取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; int is_data_block_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]; 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;}int col_number = 0;wchar_t* token = buffer;while (*token && col_number < 1) {if (*token == L',') {col_number++;}token++;}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','; 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++;}}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++;}wcsncpy(columnValue, start, token - start);columnValue[token - start] = L'\0'; return;}token++;}
}int main() {setlocale(LC_ALL, ""); FILE* file = fopen("D:\\vs2019C++practise\\YoutubeC\\source\\Test\\CF.csv", "r, ccs=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;