Как прочитать первые записи файла CSV в C? - PullRequest
0 голосов
/ 30 марта 2019

У меня есть CSV-файл, который выглядит следующим образом:

Jake, 25, Montreal
Maria, 32, London
Alex, 19, New York
Jake, 22, Dubai

Я пытаюсь реализовать функцию find_name, которая должна перебирать первое поле каждой записи и сравнивать его с именем, которое являетсяв поиске.

Я пробовал fgets, fscanf, но либо код не работает, либо я получаю ошибку сегментации.

Это то, что я имею до сих пор:

void find_name(const char *csv_filename, const char *name){
    FILE *csvFile = fopen(csv_filename, "r");
    char word[1000];

    if (csvFile == NULL)
            exit(EXIT_FAILURE);

    while ( !feof(csvFile) ) {
            fscanf(csvFile, "%s%*[^,]", word);
            if ( strcmp(word, name) == 0 )
                    printf("name found");
    }
    fclose(csvFile);
}

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: я не хотел бы использовать какую-либо функцию токенизатора, я бы предпочелпонять, как использовать fscanf.

Ответы [ 2 ]

0 голосов
/ 30 марта 2019

относительно:

 while ( !feof(csvFile) ) {
        fscanf(csvFile, "%s%*[^,]", word);
        if ( strcmp(word, name) == 0 )
                printf("name found");
}

предложить использовать:

while ( fgets( word, sizeof(word), csvFile ) )
{
    char *token = strtok( word, ", " );
    if( strcmp( token, name )  == 0 )
    {
         printf("name found");
    }
}

Однако, если вы не хотите использовать strtok(), предложите:

while ( fgets( word, sizeof word, csvFile ) )
{
    char *comma = strchr( word, ',');
    *comma = \0';

    if( strcmp( word, name )  == 0 )
    {
         printf("name found");
    }
}

однако, если вы действительно хотите использовать семейство функций scanf():

while ( fgets( word, sizeof word, csvFile ) )
{
    char possibleMatch[1000];
    if( sscanf( "%999[^,]", word, possibleMatch ) == 1 )
    {
        if( strcmp( possibleMatch, name )  == 0 )
        {
            printf("name found");
        }
    }
}

Однако, если вы действительно хотите использовать fscanf():

while ( fscanf( csvFile, "%999[^,]", word ) == 1 )
{
    if( strcmp( word, name )  == 0 )
    {
        printf("name found");
    }

    //consume rest of input file line
    int ch;
    while( ( ch = getchar() ) != EOF && ch != '\n' ){;}
}

или, может быть, даже лучше:

while ( fscanf( csvFile, " %999[^,] %*[^\n]", word ) == 1 )
{
    if( strcmp( word, name )  == 0 )
    {
        printf("name found");
    }
}
0 голосов
/ 30 марта 2019

Если вы читаете по одному полю за раз, становится довольно сложно разобраться с концом строки, поэтому советуем брать по одной строке за раз, что-то вроде:

int FieldScanCount = 0;
char city[1000];
int age = 0;
while ((FieldScanCount = fscanf(csvFile, "%1000[A-Za-z0-9 ],%i,%1000[A-Za-z0-9 ]\r\n", &word, &age, &city)) > 0) {

I 'мы предполагаем, что в конце каждой строки есть \ r \ n, но в зависимости от вашего файла это может потребоваться просто \ n.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...