读取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;