diff --git a/c/containers/lrec_parsers.c b/c/containers/lrec_parsers.c index 3f390fdd5..6d67dcfa6 100644 --- a/c/containers/lrec_parsers.c +++ b/c/containers/lrec_parsers.c @@ -174,13 +174,16 @@ lrec_t* lrec_parse_csv(hdr_keeper_t* phdr_keeper, char* data_line, char ifs, int char* value = data_line; // xxx needs hdr/data length check!!!!!! - // xxx needs pe-non-null (hdr-empty) check: sllse_t* pe = phdr_keeper->pkeys->phead; for (char* p = data_line; *p; ) { if (*p == ifs) { *p = 0; + if (pe == NULL) { // xxx to do: get file-name/line-number context in here + fprintf(stderr, "Header-data length mismatch!\n"); + exit(1); + } key = pe->value; lrec_put_no_free(prec, key, value); @@ -195,8 +198,16 @@ lrec_t* lrec_parse_csv(hdr_keeper_t* phdr_keeper, char* data_line, char ifs, int p++; } } + if (pe == NULL) { + fprintf(stderr, "Header-data length mismatch!\n"); + exit(1); + } key = pe->value; lrec_put_no_free(prec, key, value); + if (pe->pnext != NULL) { + fprintf(stderr, "Header-data length mismatch!\n"); + exit(1); + } return prec; } diff --git a/c/mapping/mapper_check.c b/c/mapping/mapper_check.c index 82db55aec..06eff30db 100644 --- a/c/mapping/mapper_check.c +++ b/c/mapping/mapper_check.c @@ -23,7 +23,7 @@ mapper_t* mapper_check_alloc() { void mapper_check_usage(char* argv0, char* verb) { fprintf(stdout, "Usage: %s %s\n", argv0, verb); fprintf(stdout, "Consumes records without printing any output.\n"); - fprintf(stdout, "Useful for doing a well-formatted check on input data.\n"); + fprintf(stdout, "Useful for doing a well-formatted check on CSV input data.\n"); } mapper_t* mapper_check_parse_cli(int* pargi, int argc, char** argv) { diff --git a/c/todo.txt b/c/todo.txt index 584aed5a0..d5ce14894 100644 --- a/c/todo.txt +++ b/c/todo.txt @@ -2,9 +2,6 @@ ! BUGFIXES ! * --ofmt ignored in put. perhaps best to reglobalize. -* csv hdr/data length check!! -* echo a|mlr --dkvp --oxtab cat puts 'a a' - ================================================================ FEATURES diff --git a/doc/content-for-record-heterogeneity.html b/doc/content-for-record-heterogeneity.html index 990d06f71..2a89e2585 100644 --- a/doc/content-for-record-heterogeneity.html +++ b/doc/content-for-record-heterogeneity.html @@ -22,7 +22,7 @@ POKI_RUN_COMMAND{{mlr --opprint cat data/het.dkvp}}HERE POKI_PUT_LINK_FOR_PAGE(reference.html)HERE):
| -POKI_RUN_COMMAND{{mlr --csv group-like data/het.dkvp}}HERE +POKI_RUN_COMMAND{{mlr --ocsv group-like data/het.dkvp}}HERE | POKI_RUN_COMMAND{{mlr --opprint group-like data/het.dkvp}}HERE |
-$ mlr --csv group-like data/het.dkvp -resource=/path/to/file,loadsec=0.45 -record_count=100,resource=/path/to/file -record_count=150,resource=/path/to/second/file +$ mlr --ocsv group-like data/het.dkvp +resource,loadsec,ok +/path/to/file,0.45,true +/path/to/second/file,0.32,true +/some/other/path,0.97,false -resource=/path/to/file,loadsec=0.45,ok=true -resource=/path/to/second/file,loadsec=0.32,ok=true -resource=/some/other/path,loadsec=0.97,ok=false +record_count,resource +100,/path/to/file +150,/path/to/second/file
+$ mlr check --help +Usage: mlr check +Consumes records without printing any output. +Useful for doing a well-formatted check on CSV input data. ++
$ mlr filter 'FNR == 2' data/small* a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 -pan=pan,1=1,0.3467901443380824=0.3467901443380824,0.7268028627434533=0.7268028627434533 +1=pan,2=pan,3=1,4=0.3467901443380824,5=0.7268028627434533 a=wye,b=eks,i=10000,x=0.734806020620654365,y=0.884788571337605134