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