inline static void personal_read(char *fname, struct account *account) { struct csv_header *header; struct csv_row *row; FILE *stream; touch_file(fname); if ((stream = fopen(fname, "r")) == NULL) ERROR("read personal %s", fname); header = csv_read_header(stream); if (header == NULL) header = csv_read_header_from_string(DEFAULT_HEADER); prepare_header(header); row = csv_read_row(stream, header); if (row == NULL) return; account->cardno = csv_find_row(row, "cardno")->value.i; account->expire = strdup(csv_find_row(row, "expire")->value.s); account->balance = csv_find_row(row, "balance")->value.d; account->state = csv_find_row(row, "state")->value.i; account->faculty = strdup(csv_find_row(row, "faculty")->value.s); csv_destory_row(row); csv_destory_header(header); fclose(stream); }
int main (int argc, char *argv[]) { GError *err = NULL; Csv *csv; GList *cur; if (argc != 2) { g_printerr ("Usage: %s CSVFILE\n", argv[0]); exit (EXIT_FAILURE); } if ((csv = csv_open_r (argv[1], DELIMITER, &err)) == NULL) { g_printerr ("%s: %s\n", argv[0], err->message); g_error_free (err); exit (EXIT_FAILURE); } while (csv_read_row (csv, &err) != NULL) { for (cur = csv->row; cur != NULL; cur = cur->next) g_print ("{%s}\n", (gchar*)cur->data); g_print ("\n"); } if (err) { g_printerr ("%s\n", err->message); g_error_free (err); } csv_close (csv); return EXIT_SUCCESS; }
int csv_select_run_child( csv_parse_t *parse, csv_result_set_t *result, size_t table_pos ) { csv_select_t *select = parse->select; csv_table_def_t *table, *table2; char *s1, *s2; int ch, has_child = select->table_count - table_pos > 1; size_t i, j, k, l, m, rp = 0, nr = 0, l1; Expr *x1; ExprList *xl_cols = select->columns; csv_row_t *row; csv_var_t *v1, v2; csv_column_def_t *col; csv_t *csv = parse->csv; /* reset table */ table = select->tables[table_pos]; PerlIO_seek( table->dstream, table->header_offset, SEEK_SET ); if( table->flags & TEXT_TABLE_COLNAMEHEADER ) { if( ! table->header_offset ) { do { ch = PerlIO_getc( table->dstream ); } while( ch != EOF && ch != '\n' ); table->header_offset = PerlIO_tell( table->dstream ); } } table->row_pos = 0; /* read rows */ while( (s1 = csv_read_row( table )) != NULL ) { #ifdef CSV_DEBUG _debug( "table '%s' row %lu\n", table->name, table->row_pos ); #endif if( has_child ) { ch = csv_select_run_child( parse, result, table_pos + 1 ); if( ch != CSV_OK ) return ch; continue; } /* eval WHERE */ if( (x1 = select->where) != NULL ) { ch = expr_eval( parse, x1 ); if( ch != CSV_OK ) return ch; if( x1->var.flags & VAR_HAS_IV ) { if( ! x1->var.iv ) continue; } else if( x1->var.flags & VAR_HAS_NV ) { if( ! x1->var.nv ) continue; } else if( x1->var.sv == NULL || x1->var.sv[0] == '0' ) continue; } /* eval columns */ for( i = 0; i < xl_cols->expr_count; i ++ ) { x1 = xl_cols->expr[i]; if( (x1->flags & EXPR_IS_AGGR) == 0 ) { ch = expr_eval( parse, x1 ); if( ch != CSV_OK ) return ch; } } if( select->groupby == NULL ) goto add_row; /* eval groupby */ for( i = 0; i < select->groupby->expr_count; i ++ ) { ch = expr_eval( parse, select->groupby->expr[i] ); if( ch != CSV_OK ) return ch; } /* search groupby row */ for( j = 0; j < result->row_count; j ++ ) { row = result->rows[j]; for( i = 0; i < select->groupby->expr_count; i ++ ) { v1 = &row->groupby[i]; x1 = select->groupby->expr[i]; VAR_COMP_OP( v2, *v1, x1->var, ==, "==", 0, 0 ); if( ! v2.iv ) goto groupby_next; } goto eval_row; groupby_next: continue; } add_row: if( select->offset && rp < select->offset ) { rp ++; continue; } if( select->limit && rp - select->offset >= select->limit ) goto finish; rp ++; Newxz( row, 1, csv_row_t ); row->select = select; if( (result->row_count % ROW_COUNT_EXPAND) == 0 ) { Renew( result->rows, result->row_count + ROW_COUNT_EXPAND, csv_row_t * ); } result->rows[result->row_count ++] = row; Newxz( row->data, result->column_count, csv_var_t ); if( select->orderby != NULL ) Newxz( row->orderby, select->orderby->expr_count, csv_var_t ); if( select->groupby != NULL ) Newxz( row->groupby, select->groupby->expr_count, csv_var_t ); nr = 1; eval_row: for( i = 0, j = 0; i < xl_cols->expr_count; i ++, j ++ ) { x1 = xl_cols->expr[i]; if( x1->op == TK_TABLE ) { table2 = x1->table; for( l = 0; l < table2->column_count; l ++, j ++ ) { col = table2->columns + l; v1 = row->data + j; s1 = table->data + col->offset; l1 = col->length; if( l1 == 4 && strcmp( s1, "NULL" ) == 0 ) continue; switch( col->type ) { case FIELD_TYPE_INTEGER: v1->iv = atoi( s1 ); v1->flags = VAR_HAS_IV; break; case FIELD_TYPE_DOUBLE: if( table2->decimal_symbol != '.' ) { s2 = strchr( s1, table2->decimal_symbol ); if( s2 != NULL ) *s2 = '.'; } v1->nv = atof( s1 ); v1->flags = VAR_HAS_NV; break; case FIELD_TYPE_CHAR: v1->sv_len = charset_convert( s1, l1, table2->charset, csv->client_charset, &v1->sv ); v1->flags = VAR_HAS_SV; break; case FIELD_TYPE_BLOB: if( l1 >= 2 && s1[0] == '0' && s1[1] == 'x' ) { l1 = (l1 - 2) / 2; if( ! l1 ) { v1->flags = 0; continue; } Renew( v1->sv, l1 + 1, char ); for( m = 0, s1 += 2; m < l1; m ++ ) { ch = CHAR_FROM_HEX[*s1 & 0x7f] << 4; s1 ++; ch += CHAR_FROM_HEX[*s1 & 0x7f]; s1 ++; v1->sv[m] = (char) ch; } v1->sv[l1] = '\0'; v1->sv_len = l1; v1->flags = VAR_HAS_SV; break; } default: Renew( v1->sv, l1 + 1, char ); Copy( s1, v1->sv, l1, char ); v1->sv[l1] = '\0'; v1->sv_len = l1; v1->flags = VAR_HAS_SV; break; } } continue; }