From adf6c0b4e0f8aa1fe0860fefc2bf88353d979222 Mon Sep 17 00:00:00 2001 From: fho4abcd Date: Tue, 17 Mar 2026 17:26:30 +0100 Subject: [PATCH] Add option to convert csv to iso-2709 Option only valid for character set ISO-8858-1, not UTF-8. --- www/cgi-bin_Linux/cnv_csv_to_iso | Bin 0 -> 39032 bytes www/cgi-bin_Windows/cnv_csv_to_iso.exe | Bin 0 -> 290644 bytes www/extra/cnv_csv_to_iso/cnv_csv_to_iso.c | 1428 +++++++++++++++++ www/htdocs/central/dbadmin/menu_bar.php | 7 + www/htdocs/central/lang/00/soporte.tab | 9 + .../central/utilities/cnv_csv_to_iso.php | 289 ++++ .../central/utilities/inc_show_work.php | 40 +- .../central/utilities/show_txt_file.php | 63 + 8 files changed, 1827 insertions(+), 9 deletions(-) create mode 100644 www/cgi-bin_Linux/cnv_csv_to_iso create mode 100644 www/cgi-bin_Windows/cnv_csv_to_iso.exe create mode 100644 www/extra/cnv_csv_to_iso/cnv_csv_to_iso.c create mode 100644 www/htdocs/central/utilities/cnv_csv_to_iso.php create mode 100644 www/htdocs/central/utilities/show_txt_file.php diff --git a/www/cgi-bin_Linux/cnv_csv_to_iso b/www/cgi-bin_Linux/cnv_csv_to_iso new file mode 100644 index 0000000000000000000000000000000000000000..63673b49953d0e8147c2d43becbf798340b86f46 GIT binary patch literal 39032 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 X?JC&0$V^24)q4a6o$uN&M^XDf4`EvS literal 0 HcmV?d00001 diff --git a/www/cgi-bin_Windows/cnv_csv_to_iso.exe b/www/cgi-bin_Windows/cnv_csv_to_iso.exe new file mode 100644 index 0000000000000000000000000000000000000000..99cd099cced9fe883cfc1d96cdf46769020cc93a GIT binary patch literal 290644 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 HUZ?*B>WExO literal 0 HcmV?d00001 diff --git a/www/extra/cnv_csv_to_iso/cnv_csv_to_iso.c b/www/extra/cnv_csv_to_iso/cnv_csv_to_iso.c new file mode 100644 index 000000000..518f7f482 --- /dev/null +++ b/www/extra/cnv_csv_to_iso/cnv_csv_to_iso.c @@ -0,0 +1,1428 @@ +/********************************************************************* + * FILE cnv_csv_to_iso.c + * This file contains c-code to convert spreadsheet information to iso-2709. + * The current NVBS process for creating new data in the ABCD database relies on + * spreadsheets with information from relative small subsets that are imported into ABCD. + * This program takes a .csv file and converts it into a loadable iso-2709 file. + * + * The steps in this process are: + * - Convert excel xls/xlsx to csv ( interactive: Excel/ commandline: VB script or Powershell) + * - Convert csv to iso ( commandline: cnv_csv_to_iso) + * - Import iso in ABCD ( interactive: ABCD) + * + * The format of the iso-2709 file is defined in the corresponding norm. + * The ABCD "beeldbank" of the NVBS requires only a subset of all options in this norm. + * + * The format of the csv-file is the excel standard format + * - Comma (or other) separated, some fields enclosed by double quotes ("") + * The structure of the csv-file: + * - The first line contains the ABCD field identifiers (e.g. 100,110,....) + * - The program converts FDT titles (e.g. "Copyright") into numeric FDT tags (e.g. 180). + * - Following lines define the data. + * - A record ends with a lineend, embedded lineends (between "") are allowed + * - A data cell gives the data of the corresponding field. (may be empty) + * - All records should have the same number of columns, however less columns as the first line is allowed + * - ABCD has repeating fields. This program can process the phenomonon in three ways: + * - Multiple columns with the same tag number are allowed. + * - Columns of repeated tags (as given by the fdt) are split at delimiter ; (see option -r) + * - Columns of repeated tags (as given by the fdt) are split at an embedded lineend + * - All methods can be used simultaneously. + * + * Compile this program for linux the cc compiler: + * cc cnv_csv_to_iso.c -o cnv_csv_to_iso + * Compile this program for linux or windows with cygwin (bash) with the gcc compiler: + * gcc -o cnv_csv_to_iso cnv_csv_to_iso.c + * This program will produce files with LF + * Compiling this program for windows command line (CMD) usage: + * By cygwin. Creates a staticly linked executable, produce files with CRLF: + * i686-w64-mingw32-gcc -o cnv_csv_to_iso.exe cnv_csv_to_iso.c + * By MinGW. Creates a staticly linked executable, produce files with CRLF: + * gcc -o cnv_csv_to_iso.exe cnv_csv_to_iso.c + * Check source on windows with cygwin. + * splint cnv_csv_to_iso.c -unrecog -nullpass -compdef -bufferoverflowhigh + * Gives several warnings. None serious at first inspection. + * Setting environment variables in bash shell (linux,cygwin,MinGW): + * export ABCD_FDT_FILE= + * + * Note-1: Function "setlocale" is not used here. This function is required for internationalization + * of the program. May influence messages to the user (with specific functions) + * Specific printf/fprintf: Influences the decimal point and the # modifier in format strings. + * Specific ispunct/is**: Influences character classification. + * Conclusion: As file I/O itself is not touched by "locale" the standard "C" locale is sufficient. + * + * AUTHOR Fred Hommersom, q00GetLine derived from NetBSD + * HISTORY: + * 2018-03-04:(fho) Initial version + * 2018-03-16:(fho) Many improvements, suitable for Linux/Windows:cygwin/Windows:MinGW + * 2018-03-17:(fho) Remove leading spaces in embedded repeatable fields + * 2018-03-18:(fho) Detect Byte Order Mark for UTF-8 (as produced by excel). Skip empty lines. Locale option + * 2018-04-05:(fho) stdin,stdout,stderr, autodetect separator, LF/CR/CRLF improved + * 2018-04-09:(fho) option -s, removed option -l, environment variables + * 2018-04-10:(fho) print BOM in case of UTF-8 with BOM + * 2018-04-20:(fho) Skip lines with only empty tokens + * 2018-05-10:(fho) Replaced q00GetLine by q00GetRecord and more to facilitate embedded lineends + * 2018-05-12:(fho) Corrected spurious error in double quote processing + * 2018-05-16:(fho) Corrected error due to bad previous correction + * 2018-05-17:(fho) Modified recordbuffersize 5000--> 9999 to accomodate huge record + * 2018-05-24:(fho) Records mat have less entries as first line. More is still an err0r. + * 2024-12-11:(fho) Merged with version FH: Added replacing linefeeds by blanks in q00ReplaceChars + * 2024-12-20:(fho) Replace linefeeds in non-repeating terms only. Remove leading spaces in arguments. Update comment + * 2026-17-03:(fho) Add check for UTF-8 characters + *_____________________________________________________________________ + * Call tree : main + * : q00ReadFDT + * : q00GetRecord + * : q00ProcessCSV + * : q00GetRecord + * : q00ReplaceChars + * : q00DetectSeparator + * : q00TokenizeCSV + * : q00TokenizeCSV + * : q00CheckFDTwithCSV + * : q00CheckActRepToks + * : q00WriteToISOFile + * : q00CreateISORecord + * : q00Help +*********************************************************************/ +#include +#include +#ifndef S_SPLINT_S /* in cygwin unistd.h references .h files that crash splint. now skipped by splint*/ +#include +#endif +#include +#include +#include + +#define VERSION "3.6 2024-12-20" +#define isStrNull(str) (str==NULL || (int)strlen(str) == 0) + +typedef struct FDT {/* Struct with values read from the fdt.Only the values used by this program */ + char type[2]; /* Single character data entry Type (Field/Heading/... + terminator)*/ + int itag; /* Numerical value identifying the field in the record (110/120/...). */ + char *title; /* Title or description of the field */ + int iprincipal;/* Marks if this field is the record`s principal entry. (0=no,1=yes) */ + int irepeating;/* Numerical value indicates if this field is repeatable (0=no,1=yes) */ +} FDT; + +/* items available in all modules of this file */ +static int CMDOPT8 = -1; /* <=0 : do not split record, 1=split record in lines of 80 characters*/ +static int CMDOPTS = -1; /* <=0 : warn for <> signs, 1=subsitute <> signs*/ +static int MAXFDTRECORDS = 100; /* Current databases have < 25 lines in their fdt */ +static int MAXISORECLEN = 9999; /* Current iso records do not exceed ~2000 characters */ +static int MAXCSVTOKENS = 250; /* Current exports have <125 columns, even with repeated fields */ + +static char CSVSTRINGIND = '"'; /* Excel uses default the double quote */ +static char* CSVDELIMITER = NULL; /* Must be set to actual character */ +static char* CSVDELIMITERSET= ",;:|.~!@#$%^&-_+=/\\?\t";/* Test delimiters. Excel uses default the comma */ +static char* ENV_FDT_FILE = "ABCD_FDT_FILE"; /* environment variable to specify the fdt filename (as option -d)*/ +static char* CNVXLS_OPT_S = "CNVXLS_OPT_S"; /* environment variable to specify option -s*/ +static char* CNVXLS_OPT_8 = "CNVXLS_OPT_8"; /* environment variable to specify option -8*/ +static char* IN_REDIR_NAME = ""; /* Dummy name to show input redirection */ +static char* INTERNALERR = "***__Internal_Error__:"; /* standard text for arraylimits etc */ +static char* ISODELIMITER = "#"; /* Field & record separator in the ISO file, the \0 is added by strcat */ +static char* OUT_REDIR_NAME = ""; /* Dummy name to show output redirection */ +static char* REPDELIMITER = NULL; /* Separator for repeats in one csv field (strtok format). Must be set to actual*/ + +/* prototypes available in all modules of this file */ +static int q00CheckActRepToks( struct FDT fdtlines[], int numfdtlines, char *tokens[], int numtokens, int reptoks[]); +static int q00CheckFDTwithCSV( struct FDT fdtlines[], int numfdtlines, char *tokens[], int numtokens); +static int q00WriteToISOFile( char *isofile, FILE **fpiso, + char *tagtokens[], int reptoks[], char *tokens[], int numtokens, + int *numoutputrecords, int *numoutputlines); +static int q00CreateISORecord( char *tagtokens[], int reptoks[], char *tokens[], int numtokens, char *isorecord); +static int q00DetectSeparator( char *record, int recordnumber ); +static int q00ProcessCSV( char *csvfile, struct FDT fdtlines[], int numfdtlines, char *isofile); +static int q00ReadFDT( char *fdtfile, int max_fdtlines, struct FDT fdtlines[], int *numlines); +static int q00ReplaceChars( char *record, int recordnumber ); +static int q00TokenizeCSV( char *record, int recordnumber, int maxtokens, char *tokens[], int *numtokens ); +static void q00Help( int helptype); +static ssize_t q00GetRecord(char **buf, size_t *bufsiz, int *filelinenr, FILE *fp); + +/******************************************************************************* + ******************************************************************************/ +int main( int argc, char *argv[] ) +/******************************************************************************* + * NAME: main + * + * DESCRIPTION + * Main routine for the cnv_csv_to_iso program. + * + * ARGUMENTS + * Argument In/Out Description + * argc In Count of command line arguments. + * argv In Set of command line arguments and vals. + * + * RETURNS + * 0 - Success + * !0 - Failure + ******************************************************************************/ +{ + int option = 0; + int index = 0; + char *infile = NULL; + char *fdtfile = NULL; + char *outfile = NULL; + char *tmpenv = NULL; + char tmpfilnam[1024]; + int num_fdtrecords = 0; + struct FDT fdtrecords[MAXFDTRECORDS]; + CSVDELIMITER = strdup("autodetect"); /* avoids change of read-only string*/ + REPDELIMITER = strdup(";"); /* avoids change of read-only string*/ + /* + ** ---------------------------------- + ** Process the commandline arguments + ** Some installations add a leading space to optarg. This is removed + */ + while ( ( option = getopt( argc, argv, "vhH8Si:d:o:c:r:" ) ) != -1 ) { + switch ( ( char ) option ) { + case 'i': + while(isspace((unsigned char)*optarg)) optarg++; + infile = optarg; + break; + case 'd': + while(isspace((unsigned char)*optarg)) optarg++; + fdtfile = optarg; + break; + case 'o': + while(isspace((unsigned char)*optarg)) optarg++; + outfile = optarg; + break; + case 'c': + while(isspace((unsigned char)*optarg)) optarg++; + CSVDELIMITER = optarg; + CSVDELIMITER[1] = '\0'; /* take only the first character */ + break; + case 'r': + while(isspace((unsigned char)*optarg)) optarg++; + REPDELIMITER = optarg; + break; + case '8': + CMDOPT8 = 1; + break; + case 'S': + CMDOPTS = 1; + break; + case 'v': + q00Help( 1 ); + goto EXIT; + case 'H': + q00Help( 2 ); + goto EXIT; + case 'h': + q00Help( 3 ); + goto EXIT; + default: + q00Help( 0 ); + goto EXIT; + } + } + + /* check spurious commandline arguments */ + for (index = optind; index < argc; index++) { + fprintf(stderr, "*** Non-option argument %s\n", argv[index]); + q00Help(0); + goto EXIT_ERROR; + } + + /* + ** Check parameters : inputfile is required and must be readable + ** Test first the commandline parameter. + ** If the parameter is empty: check if stdin is redirected + ** Yes: set dummy filename "" as inputfilename + ** No: error + */ + if ( isStrNull(infile) ) { + if ( isatty(STDIN_FILENO) == 0 ) { + infile = IN_REDIR_NAME; + } else { + fprintf(stderr, "*** Input CSV file is required ***\n"); + fprintf(stderr, "*** Use -i option or redirect standard input to this file ***\n"); + q00Help(0); + goto EXIT_ERROR; + } + } + + /* + ** Check parameters : fdtfile is required + ** Test first the command line parameter. + ** If the parameter is empty: check environment variable. + ** Still empty: error + */ + if ( isStrNull(fdtfile) ) { + fdtfile = getenv(ENV_FDT_FILE); + if ( isStrNull(fdtfile) ) { + fprintf(stderr, "*** FDT file name is required. ***\n"); + fprintf(stderr, "*** Use -d option or environment variable %s ***\n", ENV_FDT_FILE); + q00Help(0); + goto EXIT_ERROR; + } + } + + /* + ** Check parameters: output file is required + ** Test first the command line parameter. + ** If the parameter is empty: check if stdout is redirected + ** Yes:Set dummy filename "" as outputfilename + ** No: If a valid inputfilename is present: + ** Set the name of the outputfile to .iso + ** Else Error + */ + if ( isStrNull(outfile) ) { + if ( isatty(STDOUT_FILENO) == 0 ) { + outfile = OUT_REDIR_NAME; + } else { + if ( strcmp(infile,IN_REDIR_NAME) != 0 ) { + strcpy( tmpfilnam, infile); + strcat( tmpfilnam, ".iso"); + outfile = tmpfilnam; + } else { + fprintf(stderr, "*** Output ISO file is required ***\n"); + fprintf(stderr, "*** Use -o option or redirect standard output to this file ***\n"); + q00Help(0); + goto EXIT_ERROR; + } + } + } + /* + ** Delete a possible existing output file + ** No error if file does not exist + */ + if ( strcmp(outfile,OUT_REDIR_NAME) != 0 ) { + if ( unlink( outfile ) != 0 && errno!=ENOENT) { + fprintf( stderr, "*** Unable to delete existing outputfile '%s', status: %s\n", outfile,strerror(errno)); + q00Help(0); + goto EXIT_ERROR; + } + } + /* + ** Check if the enviroment variables for cmdopt8 and cmdopts are set + ** Note that the commandline option prevails + */ + tmpenv = getenv(CNVXLS_OPT_S); + if ( !isStrNull(tmpenv) && CMDOPTS <= 0 ) { + if ( strcmp(tmpenv,"0") == 0 || strcmp(tmpenv,"n") == 0 ) { + CMDOPTS = 0; + } else if ( strcmp(tmpenv,"1") == 0 || strcmp(tmpenv,"y") == 0 ) { + CMDOPTS = 1; + } else { + fprintf( stderr,"*** Value %s in invalid for environment variable %s\n", tmpenv, CNVXLS_OPT_S); + q00Help(0); + goto EXIT_ERROR; + } + } + tmpenv = getenv(CNVXLS_OPT_8); + if ( !isStrNull(tmpenv) && CMDOPT8 <= 0 ) { + if ( strcmp(tmpenv,"0") == 0 || strcmp(tmpenv,"n") == 0 ) { + CMDOPT8 = 0; + } else if ( strcmp(tmpenv,"1") == 0 || strcmp(tmpenv,"y") == 0 ) { + CMDOPT8 = 1; + } else { + fprintf( stderr,"*** Value %s in invalid for environment variable %s\n", tmpenv, CNVXLS_OPT_8); + q00Help(0); + goto EXIT_ERROR; + } + } + + /* + ** Print the result of the input parameter processing + */ + fprintf(stderr, "-i: CSV to be converted will be read from : '%s'\n", infile); + fprintf(stderr, "-d: Field Definition Table will be read from: '%s'\n", fdtfile); + fprintf(stderr, "-o: Processing results will be written to : '%s'\n", outfile); + fprintf(stderr, "-c: Separator for elements in csv line : '%s'\n", CSVDELIMITER); + fprintf(stderr, "-r: Separator for repeats in csv elements : '%s'\n", REPDELIMITER); + if ( CMDOPT8 <= 0 ) { + fprintf(stderr, "-8: ISO records are written as single line\n"); + } else { + fprintf(stderr, "-8: ISO records are split into lines of 80 characters\n"); + } + if ( CMDOPTS <= 0 ) { + fprintf(stderr, "-S: HTML brackets (<>) give a warning\n"); + } else { + fprintf(stderr, "-S: HTML brackets (<>) are replaced by double angle quotation marks («»)\n"); + } + + /* + ** ------------------------------------------------- + ** Read the fdt into a struct for further processing + */ + fprintf(stderr, "Reading the File Definition Table: %s\n", fdtfile); + if ( q00ReadFDT( fdtfile, MAXFDTRECORDS, fdtrecords, &num_fdtrecords ) !=0 ) goto EXIT_ERROR; + fprintf(stderr, "Reading the File Definition Table: extracted %d lines with Field information.\n", num_fdtrecords); + + /* + ** ------------------------------ + ** Read the csv and export to iso + */ + fprintf(stderr, "Processing csv file : %s\n", infile); + if ( q00ProcessCSV( infile, fdtrecords, num_fdtrecords, outfile ) !=0 ) goto EXIT_ERROR; + +EXIT: + fprintf(stderr, "Successfull completion\n"); + return(0); +EXIT_ERROR: + fprintf(stderr, "*** Program terminated with errors. ***\n"); + return (1); +} + +/******************************************************************************* + ******************************************************************************/ +int q00ReadFDT( char *fdtname, int max_fdtlines, FDT fdtlines[], int *numrecords) +/* +*# q00ReadFDT Read several values from the FDT file +** It is assumed that the FDT contains valid values: This code does not check validity. +** +** ARGUMENT I/O DESCRIPTION +** fdtname I String with filename of the FDT +** max_fdtlines I Maximum number of lines in array of FDT structs +** fdtlines O Array of structs with FDT info +** numrecords O Number lines extracted from the FDT +** Returns: 0 (OK), 1 (NOK) +*/ +{ + FILE *fpfdt = NULL; + char *line = NULL; /* q00GetRecord will allocate the buffer */ + char *rest = NULL; /* potential extra in token (impossible) */ + char *token= NULL; + int numrecord = -1; + int numtoken = 0; + int filelinenr = 0; + int valid_line = 0; /* 0=invalid, 1=valid*/ + size_t len = 0; + ssize_t numread = 0; + + fpfdt = fopen(fdtname, "r"); + if (fpfdt == NULL) { + fprintf(stderr, "*** Unable to open file '%s' for \"r\", status: %s\n", + fdtname, strerror(errno)); + return(1); + } + + while ( (numread = q00GetRecord(&line, &len, &filelinenr, fpfdt)) >= 0) { + token = strtok( line,"|"); + numtoken = 1; + valid_line = 0; + while ( token != NULL ) { + if( numtoken == 1 ) { + if ( strcmp(token,"F")== 0 ) { + numrecord++; + if ( numrecord >= max_fdtlines ) { + fprintf(stderr, "%s FDT has too many lines for internal storage configuration ***\n", INTERNALERR); + return 1; + } + strncpy(fdtlines[numrecord].type,token,1); + fdtlines[numrecord].type[1] ='\0'; + valid_line=1; + } + else if (strcmp(token,"H")== 0 || strcmp(token,"OD")== 0 ) { + /* Head (H) and Date/time operator creating the record (OD) are ignored */ + } + else { + fprintf(stderr, "*** FDT fieldtype '%s' is unknown to this program. (ignored)\n", token); + } + } + if ( valid_line == 1) { + if ( numtoken == 2 ) { + fdtlines[numrecord].itag=(int)strtol( token, &rest, 10); + } + else if ( numtoken == 3 ) { + fdtlines[numrecord].title = strdup(token); + } + else if ( numtoken == 4 ) { + fdtlines[numrecord].iprincipal=(int)strtol( token, &rest, 10); + } + else if ( numtoken == 5 ) { + fdtlines[numrecord].irepeating=(int)strtol( token, &rest, 10); + } + } + numtoken++; + token = strtok( NULL, "|"); + } + + } + /* debug + for (int i=0; i<=numrecord; i++ ) { + printf ("FDT info: record(%d)=%s|%d|%s|%d|%d\n", i,\ + fdtlines[i].type, fdtlines[i].itag, fdtlines[i].title,\ + fdtlines[i].iprincipal, fdtlines[i].irepeating); + } + */ + /* Check correct ending of read loop */ + if (numread == -2) return 1; + + (void)fclose(fpfdt); + if (line) free(line); + *numrecords = numrecord; + return 0; +} + +/******************************************************************************* + ******************************************************************************/ +int q00ProcessCSV( char *csvfile, struct FDT fdtlines[], int numfdtlines, char *isofile) +/* +*# q00ProcessCSV Process the csv file and write the iso file +** +** ARGUMENT I/O DESCRIPTION +** csvfile I String with filename of the csv file +** fdtlines I Array of structs with FDT info to check the csv info +** numfdtlines I Actual number of lines in array of structs +** isofile I String with filename of the iso file +** Returns: 0 (OK), 1 (NOK) +*/ +{ + FILE *fpcsv = NULL; + FILE *fpiso = NULL; + char *record = NULL; /* q00GetRecord will allocate the buffer */ + char *firstline = NULL; /* a duplicate of the first read record */ + char *token = NULL; + char *tokens[MAXCSVTOKENS]; + char *tagtokens[MAXCSVTOKENS]; + int tokenrepeating[MAXCSVTOKENS]; + int i = 0; + int numfilled = 0; + int numtokens = 0; + int recordnumber = 0; + int numtagtokens = 0; + int numoutputrecords = 0; + int numoutputlines = 0; + int filelinenr = 0; + size_t len = 0; + ssize_t numread = 0; + + /* + ** Open the input file + */ + if ( strcmp(csvfile, IN_REDIR_NAME) != 0 ) { + fpcsv = fopen(csvfile, "r"); + if (fpcsv == NULL) { + fprintf(stderr, "*** Unable to open file '%s' for \"r\", status: %s\n", + csvfile, strerror(errno)); + return 1; + } + } else { + fpcsv = stdin; + } + + while ( (numread = q00GetRecord(&record, &len, &filelinenr, fpcsv)) >=0 ) { + recordnumber++; + if ( recordnumber == 1 ) { + /* + ** Duplicate the first record as it will serve for all following data records + */ + fprintf(stderr, "Check first line of %s for correct tags ...\n", csvfile); + firstline = strdup( record ); + /* + ** Remove a possible BOM from the first token (UTF-8 BOM is printed as ) + ** The UTF-8 representation of the BOM is the (hex) byte sequence 0xEF,0xBB,0xBF + */ + if ( *firstline == '\xef' && *(firstline+1) == '\xbb' && *(firstline+2) == '\xbf') { + fprintf(stderr, "UTF-8 byte order mark detected at filestart. Hex value=%X%X%X\n", + (unsigned char)firstline[0],(unsigned char)firstline[1],(unsigned char)firstline[2]); + fprintf(stderr, "*** UTF-8 not (yet) supported (results in garbled text in ABCD)\n"); + firstline = firstline + 3; /* this way we could proceed if we know what to do */ + return 1; + } + + /* + ** Check & Detect the separator. Detect in case 'autodetect' is set + ** Tokenize the first line + */ + if ( q00DetectSeparator( firstline, recordnumber ) !=0 ) return 1; + if ( q00TokenizeCSV( firstline, recordnumber, MAXCSVTOKENS, tagtokens, &numtagtokens ) !=0 ) return 1; + + /* + ** Check the tokens with the FDT and determine the repeating tokens + */ + if ( q00CheckFDTwithCSV( fdtlines, numfdtlines, tagtokens, numtagtokens) !=0 ) return 1; + if ( q00CheckActRepToks( fdtlines, numfdtlines, tagtokens, numtagtokens, tokenrepeating) !=0 ) return 1; + fprintf(stderr, "Check first line of %s for correct tags: OK\n" , csvfile); + + } else if ( numread > 0) { + /* + ** This is a non-empty dataline + ** Replace unwanted characters if necessary + */ + if ( q00ReplaceChars( record, recordnumber ) == 1 ) return 1; + + /* + ** Tokenize this csv record + */ + if ( q00TokenizeCSV( record, recordnumber, MAXCSVTOKENS, tokens, &numtokens ) !=0 ) return 1; + /* + ** Check that the record has at least one token with some content + */ + numfilled = 0; + for ( i=0; i 0 ) { + /* debug + for (int i=0; i numtagtokens ) { + fprintf(stderr, "*** Record %d has %d tokens, while line 1 has %d tokens. These numbers must be equal.\n",\ + recordnumber, numtokens, numtagtokens); + return 1; + } + if ( q00WriteToISOFile( isofile, &fpiso, + tagtokens, tokenrepeating, tokens, numtokens, + &numoutputrecords, &numoutputlines) !=0 ) return 1; + } else { + fprintf(stderr,"- Skipped record %d (only empty tokens}\n", recordnumber); + } + } else { + fprintf(stderr,"- Skipped record %d (empty)\n", recordnumber); + } + } + /* Check correct ending of read loop */ + if (numread == -2) return 1; + /* Close files. Dont care about errors (includes redirection)*/ + (void)fclose(fpcsv); + if ( fpiso!=NULL) { + (void)fclose(fpiso); + } + fprintf(stderr, "Processed %d records with %d lines from CSV file '%s'\n", recordnumber, filelinenr, csvfile); + fprintf(stderr, "Written %d records in %d lines to ISO file '%s'\n", numoutputrecords, numoutputlines, isofile); + if (record) free(record); + return 0; +} + +/******************************************************************************* + ******************************************************************************/ +int q00DetectSeparator( char *record, int recordnumber ) +/* +*# q00DetectSeparator Detect the separator in the csv file. +** If global variable CSVDELIMITER is set to 'autodetect' this module will determine a +** reasonable delimiter character from the set given by global variable CSVDELIMITERSET +** Global CSVDELIMITER will be set if this character is found +** Global CSVDELIMITER is not touched if not set to 'autodetect' +** +** ARGUMENT I/O DESCRIPTION +** record I Record from the csvfile. +** recordnumber I Recordnumber of the csvfile. +** Returns: 0 (OK), 1 (NOK) +*/ +{ + char *tokens[MAXCSVTOKENS]; + char *tstrecord = NULL; + char *bestdelimiter = NULL; + int numtokens = 0; + int bestnum = 0; + int i = 0; + + /* Check if there is anything to process */ + if ( isStrNull(record) ) { + fprintf(stderr, "*** Cannot check/detect a separator in an empty record\n"); + return 1; + } + /* Check if we have autodetection */ + if ( strcmp(CSVDELIMITER, "autodetect") == 0 ) { + /* create changeable string for CSVDELIMITER (originally static). Too long, but don't care */ + CSVDELIMITER = strdup(CSVDELIMITERSET); + for ( i=0; i<(int)strlen(CSVDELIMITERSET); i++ ) { + tstrecord = strdup(record); + strncpy ( CSVDELIMITER, &CSVDELIMITERSET[i], 1 ) ; + CSVDELIMITER[1] = '\0'; + if ( q00TokenizeCSV( tstrecord, recordnumber, MAXCSVTOKENS, tokens, &numtokens ) !=0 ) return 1; + if ( numtokens > bestnum ) { + bestnum = numtokens; + free(bestdelimiter); + bestdelimiter = strdup(CSVDELIMITER); + } + free(tstrecord); + } + if ( bestnum < 2 ) { + fprintf(stderr, "*** Only %d token(s) detected, while using best separator \'%s\' (out of %s).\n", + bestnum, bestdelimiter,CSVDELIMITERSET); + fprintf(stderr, "*** Record= %s\n",record); + fprintf(stderr, "*** Is this the correct file?\n"); + return 1; + } + else { + CSVDELIMITER = strdup(bestdelimiter); + free(bestdelimiter); + fprintf(stderr, "- Best results in delimiter detection gives \'%s\' (%d tokens).\n", CSVDELIMITER, bestnum); + } + } + else { + if ( ispunct((char)CSVDELIMITER[0]) == 0 ) { + fprintf(stderr, "*** Character \'%s\' cannot be used as separator for a csv file. \n",CSVDELIMITER); + return 1; + } + tstrecord = strdup(record); + if ( q00TokenizeCSV( tstrecord, recordnumber, MAXCSVTOKENS, tokens, &numtokens ) !=0 ) return 1; + if ( numtokens <= 2) { + fprintf(stderr, "*** Only %d token(s) detected in record, while using separator \'%s\'. \n",numtokens, CSVDELIMITER); + fprintf(stderr, "*** Record= %s\n",record); + fprintf(stderr, "*** Might be wrong separator (see -c option, consider default 'autodetect')\n"); + return 1; + } + free(tstrecord); + } + return 0; +} + +/******************************************************************************* + ******************************************************************************/ +int q00TokenizeCSV( char *record, int recordnumber, int maxtokens, char *tokens[], int *numtokens ) +/* +*# q00TokenizeCSV Separate a csv record into tokens. +** Excel separates with comma's, and in case the value contains a comma the values is enclosed by quotes. +** Example: token1,token2,"token with ,",token with spaces,"", +** Note: The record may contain embedded linefeeds (not processed here) +** The inputrecord may contain a trailing separator: will be removed. +** +** ARGUMENT I/O DESCRIPTION +** record I record from the csvfile. Modified: zeros at token endings +** recordnumber I recordnumber of the csv file. +** maxtokens I Size of array tokens +** tokens O Array elements point to tokens in the csvrecord +** numtokens O Number of found tokens (== elements with a value in array tokens) +** Returns: 0 (OK), 1 (NOK) +*/ +{ + int state = 0; /* 0=init, 1=normal token, 2=token with quotes */ + int recordlength = 0; + int i = 0; /* pointer in input record */ + int tokenindex = -1; /* initial value if nothing found */ + char testc; + char testc2; + + /* Detect record size once because the code inserts zeros at token ends */ + recordlength = (int)strlen(record); + /* Loop over the string to detect tokens */ + for ( i=0; i < recordlength; i++ ) { + testc = record[i]; + if ( testc == '\0') { + /* The loop variable i can address NULLs in case of memmoves */ + /* Tests for unclosed tokens :TBD */ + } else if ( state == 0 ) { + /* No active token */ + if ( testc == CSVDELIMITER[0]) { + /* empty token */ + record[i] ='\0'; + tokenindex++; + tokens[tokenindex]=&record[i]; + } else if ( testc == CSVSTRINGIND ) { + /* token with quotes, start new target token beyond the quote */ + tokenindex++; + tokens[tokenindex]=&record[i+1]; + state = 2; + } else { + /* begin of new target token */ + tokenindex++; + tokens[tokenindex]=&record[i]; + state = 1; + } + } else if ( state == 1 ) { + /* normal token active */ + if ( testc == CSVDELIMITER[0] ) { + /* end of token, terminate target token */ + record[i] ='\0'; + state = 0; + } + } else if ( state == 2 ) { + /* quoted token is active */ + if ( testc == CSVSTRINGIND ) { + /* action depends on next character*/ + testc2 = record[i+1]; + if ( testc2 == CSVSTRINGIND ) { + /* + ** If quote followed by quote: Means a single quote + ** Action: shift tail 1 position left and add terminator at end + ** Note that the loop needs no adjustment + */ + memmove((void*)&record[i+1],(void*)&record[i+2], strlen(&record[i+2])); + record[i + strlen(&record[i+1]) ] = '\0'; + } + else if ( testc2 == CSVDELIMITER[0] || testc2 == '\0' ) { + /* + ** If quote followed by comma or end of the string: Means end of token + ** Action: terminate target token and skip the comma + */ + record[i] = '\0'; + i++; + state = 0; + } + } + } /* end of statemachine if */ + if ( tokenindex > maxtokens ) { + fprintf(stderr, "%s Record %d contains %d tokens: too many tokens (max=%d)\n", + INTERNALERR,recordnumber,tokenindex,maxtokens); + return 1; + } + } /* end of loop over input record */ + *numtokens = tokenindex+1; + return 0; +} + +/******************************************************************************* + ******************************************************************************/ +int q00CheckFDTwithCSV( struct FDT fdtlines[], int numfdtlines, char *tokens[], int numtokens) +/* +*# q00CheckFDTwithCSV Check that csv tokens are valid and present in the FDT. +** The token must be 3 positions +** The token must consist of 3 digits. +** The token must be present in the fdt. +** +** ARGUMENT I/O DESCRIPTION +** fdtlines I Array of structs with FDT info to check the csv info +** numfdtlines I Actual number of lines in array of structs +** tokens I Array elements pointing to tokens of the firstline +** numtokens I Number of tokens in the token array +** Returns: 0 (OK), 1 (NOK) +*/ +{ + int ltoken = 0; + int ierr = 0; + int digerr = 0; + int tagfound = 0; + int csvtag = 0; + int i = 0; + int j = 0; + char *token = NULL; + + /* + ** For each token: if it is a title in the FDT: replace by the tagnumber + ** Only if the token length can accommodate a tag of 3 positions + ** This is a convenience function. + ** If no substitution: error checks will be done by rest of the code + */ + for ( i=0; i= 3 ) { + fprintf(stderr, "- Column %d: value '%s' (= title in FDT) replaced by tag '%3d'\n", \ + i+1, fdtlines[j].title, fdtlines[j].itag); + /* sprintf adds a trailing \0, so this is safe code */ + sprintf( token,"%3d",fdtlines[j].itag); + } + } + } + /* + ** For each token: check that the token is 3 positions + */ + for ( i=0; i 0 ) { + fprintf(stderr, "*** Column %d of line 1 with value '%s' contains non-digits\n", i+1, tokens[i]); + ierr++; + } + } + /* + ** For each token: check that it exists in the FDT (as tag) + */ + for ( i=0; i 0 ) return 1; + return 0; +} + +/******************************************************************************* + ******************************************************************************/ +int q00CheckActRepToks( struct FDT fdtlines[], int numfdtlines, char *tokens[], int numtokens, int reptoks[]) +/* +*# q00CheckActRepToks Detect which tokens in the csv are defined as Repeating in the FDT. +** Check that non-repeating tokens appear only once +** +** ARGUMENT I/O DESCRIPTION +** fdtlines I Array of structs with FDT info to check the csv info +** numfdtlines I Actual number of lines in array of structs +** tokens I Array elements pointing to tokens of the firstline +** numtokens I Number of tokens in the token array +** reptoks O Value = 0: standard tag. Value = 1: Repeating tag +** Returns: 0 (OK), 1 (NOK) +*/ +{ + char *token = NULL; + int csvtag = 0; + int ierr = 0; + int i = 0; + int j = 0; + + /* + ** Determine the repeating tokens and administrate this in array reptoks + */ + for ( i=0; i < numtokens; i++ ) { + reptoks[i] = 0; /* default non-repeating */ + token=tokens[i]; + csvtag = (int)strtol( token, (char **)NULL, 10); + for ( j=0; j<=numfdtlines; j++ ) { + if ( fdtlines[j].itag == csvtag) reptoks[i] = fdtlines[j].irepeating; + } + } + + /* + ** Check that non-repeating tokens appear only once + */ + for ( i=0; i < numtokens; i++ ) { + if ( reptoks[i] == 0) { + for ( j=i+1; j < numtokens; j++ ) { + if (strcmp( tokens[i], tokens[j] ) == 0 ) { + fprintf(stderr, "*** Column %d and %d of line 1 contain duplicate non-repeating tag '%s'\n", i+1,j+1, tokens[i]); + ierr++; + } + } + } + } + if ( ierr > 0 ) return 1; + return 0; +} + +/******************************************************************************* + ******************************************************************************/ +static int q00WriteToISOFile( char *isofile, FILE **fpiso, + char *tagtokens[], int reptoks[], char *tokens[], int numtokens, + int *numoutputrecords, int *numoutputlines) +/* +*# q00WriteToISOFile Write a csvline to the ISO file +** +** ARGUMENT I/O DESCRIPTION +** isofile I name of the iso file +** fpiso I/O Filepointer to the iso file. Opened by this procedure +** tagtokens I Array elements pointing to tokens of the firstline +** reptoks I Array with 'repeat' information of tagtokens. 0: standard tag. 1: Repeating tag +** tokens I Array elements pointing to tokens of the csv line +** numtokens I Number of tokens in the all 3 arrays +** numoutputrecords I/O Number of written output records. +** numoutputlines I/O Number of written output lines. +** Returns: 0 (OK), 1 (NOK) +*/ +{ + char isorecord[MAXISORECLEN]; + int i=0; + int isoreclen = 0; + /* + ** Open the outputfile if not done yet + ** If the outputfile is a real file: open it. + ** If the outputfile is redirected: set the filepointer + */ + if ( *fpiso == NULL ) { + if ( strcmp(isofile, OUT_REDIR_NAME) != 0 ) { + *fpiso = fopen(isofile, "w"); + if (*fpiso == NULL) { + fprintf(stderr, "*** Unable to open file '%s' for \"w\", status: %s\n", + isofile, strerror(errno)); + return 1; + } + } else { + *fpiso = stdout; + } + fprintf(stderr, "Writing records to ISO file '%s'\n", isofile); + } + /* + ** Create the ISO record + */ + if ( q00CreateISORecord( tagtokens, reptoks, tokens, numtokens, isorecord) !=0 ) return 1; + /* + ** Export to the iso file + */ + if ( CMDOPT8 <= 0 ) { + /* Write record as single line */ + fprintf( *fpiso,"%s\n", isorecord); + ++*numoutputlines; + } else { + /* Write record in lines of 80 characters */ + isoreclen = (int)strlen(isorecord); + for ( i=0; i < isoreclen; i++ ) + { + fprintf (*fpiso,"%c", isorecord[i]); + if ( ((i+1) % 80) == 0 ) { + fprintf (*fpiso,"\n"); + ++*numoutputlines; + } + } + /* write trailing newline if not yet done in the loop */ + if ( (isoreclen % 80 ) != 0) { + fprintf (*fpiso,"\n"); + ++*numoutputlines; + } + } + ++*numoutputrecords; + return 0; +} + + +/******************************************************************************* + ******************************************************************************/ +int q00CreateISORecord( char *tagtokens[], int reptoks[], char *tokens[], int numtokens, char *isorecord) +/* +*# q00CreateISORecord Create an iso record from one csvrecord +** +** ARGUMENT I/O DESCRIPTION +** tagtokens I Array elements pointing to tokens of the firstline +** reptoks I Array with 'repeat' information of tagtokens. 0: standard tag. 1: Repeating tag +** tokens I Array elements pointing to tokens of the csv record +** numtokens I Number of tokens in the all 3 arrays +** isorecord O String with a single ISO record, null terminated. +** Returns: 0 (OK), 1 (NOK) +*/ +{ + int recordlength = 0; + int baseaddress = 0; + int toklen = 0; + int i = 0; + int startpos = 0; + int numacttokens = 0; + char delimstring[3]; /* space for 2 delimiters + traling 0 */ + char *token = NULL; + char *subtoken = NULL; + char *tag = NULL; + char dir[MAXCSVTOKENS][13]; /* computed directory entries, size = numtokens + possible repeats */ + char *data[MAXCSVTOKENS]; /* each pointer points to an element in the csv record */ + char delimiterLF = '\n'; + + delimstring[0] = '\n'; + delimstring[1] = REPDELIMITER[0]; + delimstring[2] = '\0'; + + /* + ** Compute the directory entries + */ + for ( i=0; i < numtokens; i++ ) { + token = tokens[i]; + if ( (int)strlen(token) > 0 ) { + tag = tagtokens[i]; + /* Write directory entry (for every token 12 positions) + ** entry = "tttllllsssss + ** | || |sssss :starting character position (Size=S, see head definition) + ** | |llll :total number of octets in the field (inc fieldsep),(Size=F, see head definition) + ** ttt :tag + */ + if ( reptoks[i] == 0 ) { + /* + ** Non-repeating token: + ** Embedded linefeeds are replaced by a space. + ** The CSV allows embedded linefeeds, but the ISO importer not + */ + int tokenlength = strlen(token); + for (int i = 0; i < tokenlength; i++) { + if (token[i] == delimiterLF) { + token[i] = ' '; + } + } + toklen = (int)strlen(token) + 1; /* including the fieldsep */ + sprintf( dir[numacttokens],"%s%04d%05d",tag,toklen,startpos); + data[numacttokens] = tokens[i]; + + startpos = startpos + toklen; + numacttokens++; + if ( numacttokens >= MAXCSVTOKENS ) { + fprintf(stderr, "%s q00CreateISORecord: Too many tokens (>%d) for internal storage configuration ***\n",\ + INTERNALERR,numacttokens); + return 1; + } + } + else { + /* + ** Repeating token: one token may contain subtokens + ** Split the token by the separator and create + ** a directory entry for each subtoken with real data. + */ + subtoken = strtok( token,delimstring); + while ( subtoken != NULL ) { + /* Set subtoken pointer beyond leading spaces */ + while( isspace((unsigned char)*subtoken) ) subtoken++; + + /* write the subtoken if stil any data left */ + if ( strlen(subtoken) > 0 ) { + toklen = (int)strlen(subtoken) + 1; /* including the fieldsep */ + sprintf( dir[numacttokens],"%s%04d%05d",tag,toklen,startpos); + data[numacttokens] = subtoken; /* = beyond leading spaces */ + + startpos = startpos + toklen; + numacttokens++; + if ( numacttokens >= MAXCSVTOKENS ) { + fprintf(stderr, "%s q00CreateISORecord: Too many tokens (>%d) for internal storage configuration ***\n",\ + INTERNALERR,numacttokens); + return 1; + } + } + subtoken = strtok( NULL, delimstring); + } + } + } + } + + /* + ** Put heading information to the beginning of the iso record + ** head = "rrrrr0000000ddddd0004500"; + ** 012345678901234567890123 + ** | ||| |||| || ||||X :for future use(=0) + ** | ||| |||| || |||Y :length of implementation defined part(=0) + ** | ||| |||| || ||S :length of starting character position in each entry (=5) + ** | ||| |||| || |F :length of 'length of field' (=4) + ** | ||| |||| |UUU :for user systems (=000) + ** | ||| |||ddddd :base address of data + ** | ||| ||L :identifier length (=0) + ** | ||| |L :indicator length (=0) + ** | ||IIII :implementation codes (=0000) + ** | |S :status (=0) + ** rrrrr :record length + */ + recordlength = 24 + numacttokens*(12) + startpos + 2; + baseaddress = 24 + numacttokens*12 + 1; + sprintf( isorecord, "%05d0000000%05d0004500",recordlength,baseaddress); + if ( recordlength+1 >= MAXISORECLEN ) { + fprintf(stderr, "%s q00CreateISORecord: Computed recordlength (%d) too large for buffer (%d) ***\n",\ + INTERNALERR,recordlength,MAXISORECLEN); + return 1; + } + + /* + ** Add directory information to the iso record, without separator. + ** The directories are stored in the dir array + ** The information is terminated by a # + */ + for ( i=0; i < numacttokens; i++ ) { + strcat ( isorecord, dir[i]); + } + strcat( isorecord, ISODELIMITER); + + /* + ** Add data to the iso record, separated by # + ** Pointers to the data elements are present in the data array + */ + for ( i=0; i < numacttokens; i++ ) { + /* debug + fprintf(stderr, "data %d (%.3s)(%s) %i\n",i, dir[i], dir[i],strlen(data[i])); + fprintf(stderr, "data %d (%.3s)(%s)= %s\n",i, dir[i], dir[i],data[i]); + */ + strcat( isorecord, data[i]); + strcat( isorecord, ISODELIMITER); + } + + /* Add trailing record separator */ + strcat( isorecord, ISODELIMITER); + return 0; +} + +/******************************************************************************* + ******************************************************************************/ +void q00Help( int helptype ) +/* +*# q00Help Prints help information. +** +** ARGUMENT I/O DESCRIPTION +** helptype I indicator of required help (0=short help, 1=version,2=excel format, other=usage) +** +** Returns: Nothing +*/ +{ + if ( helptype == 0 ) { + fprintf(stderr, "*** Run this program with option -h or -H to show usage information *** \n"); + } + else if ( helptype == 1 ) { + fprintf(stderr, "Version %s, compiled on %s, %s\n", VERSION, __DATE__,__TIME__); + } + else if ( helptype == 2 ) { + fprintf(stderr, "\ +The csv file for this converter has following structure:\n\ + The format of each record is the csv format:\n\ + - Each column in the excel is transformed into a token\n\ + - A token may be enclosed by quotes (\"abcd\").\n\ + - Tokens are separated by a comma or other separator (see excel documentation)\n\ + - The trailing separator is optional\n\ + Examples:\n\ + token1,\"to ken 2\",token3,\"\",\n\ + token1,\"to ken 2\",token3,\"\"\n\n\ + The first line contains information about the target tag\n\ + - ABCD 'Tag's are numbers consisting of 3 digits (e.g. 100, 110,150,...).\n\ + - ABCD 'Titles' correspond normally 1:1 with the tags: 'Copyright'-> 180.\n\ + - Titles are allowed and will be translated by this program into the correct tag.\n\ + Example: \n\ + 100,Copyright,120 -> 100,180,120\n\ + - The sequence of the tags is free: may be different from the target ABCD.\n\ + - Duplicate tags are allowed if the tag is a 'repeating' tag.\n\n\ + Each next record contains the data of a single ABCD record\n\ + - Records should have the same number or less tokens as the first line (=standard excel export).\n\ + - Empty tokens are allowed (\"\").\n\ + - In tokens of repeating tags it is possible to enter 'repeats'.\n\ + - These repeats are separated by a semicolon or an other separator.\n\ + - These repeats can also be separated by a new line (alt-enter in Excel).\n\ + Examples:\n\ + \"single token\",\"Amsterdam;Rotterdam\",singleword,,\n\ + \"single token\",\"Amsterdam;;Rotterdam; Den Haag\",singleword,\"\", \n\n\ + - Embedded new lines in fields for non-repeating tags are replaced by a space\n\ +Excel specific notes on \"Save As\" -> \"CSV (delimited by..)\" :\n\ + - The separator is set in Control panel -> Region -> Advanced -> Set list separator.\n\ + - If the decimal symbol is a comma, the list separator will be a semicolon even if set otherwise!\n\ + - Saving in UTF-8 is NOT recommended\n\n\ +Option -h will show how to run this program\n\ +"); + } + else { + fprintf(stderr, "\ +Function: This program converts a CSV file into an ISO-2709 file.\n\ + Intended for uploading Excel data into the ABCD database.\n\ +Commandline options:\n\ + -i [-d ] [-o ]\n\ + [-c ] [-r ]\n\ + [-8] [-S] [-v] [-h] [-H]\n\ + options:\n\ + -i - Path to csv inputfile to be converted to ISO-2709\n\ + -d - Path to FDT file (Field Definition Table) (e.g. snrbld.fdt)\n\ + -o - Path to iso outputfile. Default is .iso.\n\ + -c - Separator in the csv file. Default is '%s'.\n\ + -r - Separator for repeating fields in one csv element. Default is '%s'.\n\ + -8 - Split isorecord into lines of 80 characters. Default is no split\n\ + -S - Detect or replace HTML < and >. Default is 'detect'.\n\ + -v - version information\n\ + -h - usage/function information (this message)\n\ + -H - Info about csv file structure\n\ +Environment influence:\n\ + Environment variable '%s' is the fallback for option -d \n\ + Environment variable '%s' is the fallback for option -8 (values 0,n/1,y)\n\ + Environment variable '%s' is the fallback for option -S (values 0,n/1,y)\n\ + Redirected Standard input is the fallback for option -i \n\ + Redirected Standard output is the fallback for option -o \n\ +Examples: ./cnv_csv_to_iso -i myscans.csv\n\ + ./cnv_csv_to_iso < myscans.csv -o myupload.iso\n\ + ./cnv_csv_to_iso < myscans.csv > myupload.iso\n\ + ./cnv_csv_to_iso -i myscans.csv -d odrfot.fdt\n\ + ./cnv_csv_to_iso -i myscans.csv -d odrfot.fdt -o myupload.iso -c ';' -8 -S\n\ +",CSVDELIMITER,REPDELIMITER,ENV_FDT_FILE, CNVXLS_OPT_8, CNVXLS_OPT_S); + } + +return; +} + +/******************************************************************************* + ******************************************************************************/ +int q00ReplaceChars( char *record, int recordnumber ) +/* +*# q00ReplaceChars Check and/or replace undesired characters +** +** ARGUMENT I/O DESCRIPTION +** record I/O Record from the csvfile. +** recordnumber I Recordnumber of the csvfile. +** Returns: 0 (OK), 1 (NOK) +*/ +{ + int i =0; + int numlt = 0; + int numgt = 0; + int numutf = 0; + unsigned char testc, testc2, testc3, testc4; + int length = (int)strlen(record); + + /* Loop over the string to detect the bloody characters */ + for ( i=0; i < length; i++ ) { + testc = record[i]; + testc2 = 0; + if ( i < length+1 ) testc2=record[i+1]; + if ( testc == '<' ) { + numlt++; + if ( CMDOPTS > 0 ) { + record[i] = '«'; + } + } else if ( testc == '>' ) { + numgt++; + if ( CMDOPTS > 0 ) { + record[i] = '»'; + } + } else if ( (testc&0xc0) == 0xc0 && (testc2&0xc0) == 0x80 ) { + /* + ** first test 11...... on testc, then test 10...... on testc2 + ** This test is insufficient and may give false positives but very rare. + */ + numutf++; + //fprintf(stderr,"value of chars: %x %x\n",testc, testc2); + } + + } + if ( numlt > 0 || numgt > 0 ) { + if ( CMDOPTS <= 0 ) { + fprintf( stderr, "- Record %d: Detected %d < signs, and %d > signs.\n", recordnumber,numlt,numgt); + } else { + fprintf( stderr, "- Record %d: Replaced %d < signs, and %d > signs.\n", recordnumber,numlt,numgt); + } + } + + if ( numutf > 0 ) { + fprintf( stderr, "*** - Record %d: Contains %d possible UTF-8 characters.\n", recordnumber,numutf); + } + + return 0; +} + +/******************************************************************************* + ******************************************************************************/ +ssize_t q00GetRecord(char **buf, size_t *bufsiz, int *filelinenr, FILE *fp) +/* +*# q00GetRecord Get a record from a stream +** Standard gcc distributions have the non-standard/non-posix function 'getline'. +** Note: This code is inspired by the NetBSD code and NOT an exact copy. +** Functional Modifications: +** Does NOT return the line terminators, +** Accepts LF, CRLF and CR as terminators +** Interpretes strings enclosed by double quotes +** Improved error handling +** +** In Linux we have LF (inside "" returned as LF) +** In DOS we have CRLF (inside "" returned as LF) +** In MAC we have CR (inside "" returned as LF) +** +** +** ARGUMENT I/O DESCRIPTION +** buf I/O Record read, possibly reallocated +** bufsiz I/O Size of give/reallocated buffer. +** fp I Filepointer +** Returns: >=0 The number of characters read, without terminating null byte +** -1 End of file +** -2 Other error (prints error)(e.g. io error/memory error/...) +*/ +{ + static char *ptr; + char *eptr; + int delimiterLF = (int)'\n'; + int delimiterCR = (int)'\r'; + int delimiterDQ = (int)'"'; + int CRread = 0; /* 0=No unprocessed CR, 1=CR read, to be processed */ + int state = 0; /* 0=outside quotes, 1=inside quotes */ + + if (*buf == NULL || *bufsiz == 0) { + *bufsiz = BUFSIZ; /* BUFSIZ defined in stdio.h typical 1024/512 */ + if ((*buf = malloc(*bufsiz)) == NULL) { + fprintf( stderr, "*** Unable to allocate memory (size=%d) during read operation\n", (int)*bufsiz); + return -2; + } + } + /* Loop over characters in the file */ + for (ptr = *buf, eptr = *buf + *bufsiz;;) { + int c = fgetc(fp); + if (c == EOF) { + /* + ** End of file and any other error + ** End of file is accordingly to Unix convention only at line-end, but... + ** manually edited files my end without \n: add safety trailing \0 + */ + *ptr = '\0'; + /* Test that the embedded strings are correctly terminated */ + if ( state != 0 ) { + fprintf(stderr, "*** Read error: End of file inside an embedded string\n"); + fprintf(stderr, "*** Check for unmatched double quotes in last record\n"); + return -2; + } + if ( feof(fp) != 0) { + /* end of file:return rest of string if any. + ** Next call will return -1 characters + ** This is a regular end of this function + */ + if (ptr != *buf) (*filelinenr)++; + return (ptr == *buf) ? ((ssize_t)-1) : (ssize_t)(ptr - *buf); + } else { + /* Any other error */ + fprintf(stderr, "*** Unexpected read error: %s\n",strerror(errno)); + return -2; + } + } else if (c == delimiterCR ) { + /* A CR may be a delimiter. + ** Next character gives solution + */ + CRread = 1; /* remember this in case LF follows */ + } else if (c == delimiterLF) { + /* A normal LF ends the record. + ** An embedded LF goes into the buffer + */ + (*filelinenr)++; + if ( state == 0 ) { + /* outside string: set 0 in buffer and return */ + *ptr = '\0'; + return (ssize_t)(ptr - *buf); + } else { + /* inside string: set LF in buffer */ + *ptr = delimiterLF; + ptr++; + *ptr='\0'; /* to enable debug printing */ + CRread = 0; + } + } else { + /* Any character except CR or LF + ** If the previous was a CR: + ** Process the CR now it is known that no LF followed it. + ** If the character is double quote: toggle inside/outside + ** Add character to the buffer + */ + if ( CRread == 1 ) { + (*filelinenr)++; + if ( state == 0 ) { + /* outside string: Push current character back and return read line */ + /*fprintf(stderr,"2c=%d,crread=%d,filepointer=%lx\n",c,CRread,ftell(fp));*/ + if ( ungetc( c, fp ) < 0 ) { + fprintf(stderr,"*** Ungetc error status %s\n",strerror(errno)); + return -1; + } + *ptr = '\0'; + ptr++; + return (ssize_t)(ptr - *buf); + } else { + /* inside string: set LF in buffer */ + *ptr = delimiterLF; + ptr++; + } + } + /* toggle the state for a delimiter */ + if ( c == delimiterDQ ) { + if ( state == 0 ) state=1; else state=0; + } + /* add to buffer */ + CRread = 0; + *ptr = (char)c; + ptr++; + *ptr='\0'; /* to enable debug printing */ + } + + /* Reallocate the buffer if not enough space left */ + if (ptr + 3 >= eptr) { + char *nbuf; + size_t nbufsiz = *bufsiz * 2; + ssize_t d = (ssize_t)(ptr - *buf); + if ((nbuf = realloc(*buf, nbufsiz)) == NULL) { + fprintf( stderr, "*** Unable to reallocate memory (size=%d) during read operation\n", (int)*bufsiz); + return -2; + } + *buf = nbuf; + *bufsiz = nbufsiz; + eptr = nbuf + nbufsiz; + ptr = nbuf + d; + } + } +} +/********************* end of file ***********/ \ No newline at end of file diff --git a/www/htdocs/central/dbadmin/menu_bar.php b/www/htdocs/central/dbadmin/menu_bar.php index 3dd2cd571..2345889ff 100644 --- a/www/htdocs/central/dbadmin/menu_bar.php +++ b/www/htdocs/central/dbadmin/menu_bar.php @@ -30,6 +30,7 @@ 20220609 fho4abcd Add module to configure digital document types 20240627 fho4abcd Add Manage gizmo's, removed create gizmo (covered my Manage gizmo's) 20250924 fho4abcd Add sort option, translate cleandb +20260315 fho4abcd Add convert csv to iso option */ $lang = $_SESSION["lang"]; unset($_SESSION["Browse_Expresion"]); @@ -224,6 +225,11 @@ function EnviarFormaMNT(Opcion, Mensaje) { document.admin.cipar.value = base + ".par" document.admin.action = "../utilities/match_iso_with_fdt.php" break; + case "cnvcsvtoiso": //Convert csv to ISO file + document.admin.base.value = base + document.admin.cipar.value = base + ".par" + document.admin.action = "../utilities/cnv_csv_to_iso.php" + break; case "barcodecheck": //Marino barcode check document.admin.base.value = base document.admin.cipar.value = base + ".par" @@ -302,6 +308,7 @@ function EnviarFormaMNT(Opcion, Mensaje) {
  • +
  • diff --git a/www/htdocs/central/lang/00/soporte.tab b/www/htdocs/central/lang/00/soporte.tab index 06a9b62c8..8bfb345f3 100644 --- a/www/htdocs/central/lang/00/soporte.tab +++ b/www/htdocs/central/lang/00/soporte.tab @@ -110,11 +110,20 @@ cg_valactual=Apply the change when the field has the following content checking=Check commandline=Command line cn_sel=You selected the control number. Proceed? +cnvcsv_html=Detect or replace HTML < and > +cnvcsv_html_def=Unchecked is 'detect' +cnvcsv_sep=Separator in the csv file +cnvcsv_sep_def=Default is 'autodetect' +cnvcsv_seprep=Separator for repeating fields in one csv element +cnvcsv_seprep_def=Default is ';' +cnvcsv_test=Test cnv_csv_to_iso cnv_aedit=Edit/change conversion table cnv_aelim=Delete conversion table cnv_aselc=Continue with selected conversion table cnv_avis=Display conversion table cnv_carga=Load TXT file +cnv_csv=CSV file +cnv_csv_to_iso=Convert .csv file to an ISO file cnv_deltab=Do you want to delete the file cnv_dispcnvtab=Show conversion table cnv_export=Export diff --git a/www/htdocs/central/utilities/cnv_csv_to_iso.php b/www/htdocs/central/utilities/cnv_csv_to_iso.php new file mode 100644 index 000000000..0d2c3950f --- /dev/null +++ b/www/htdocs/central/utilities/cnv_csv_to_iso.php @@ -0,0 +1,289 @@ + + + + + + + +
    +
    +

    + +

    + +
    + +
    +
    + '.$msgstr["cnvcsv_test"].' '; + // determine the fdt file + $fullfdtfile=$db_path.$arrHttp["base"]."/def/$lang/$base.fdt"; + // Construct an output filename + $isofilefdt=substr_replace($file_value,"_fdt_$base.iso",-4); + ?> + + + + + + + + + + + + + +

    + + +
    + + + $value){ + if ( $var!= "deleteiso" ){ + // some values may contain quotes or other "non-standard" values + $value=htmlspecialchars($value); + echo "\n"; + } + } + ?> + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + 1){ /* - Last screen: execution and result -*/ + $file_label=$msgstr["archivo"].": "; + $file_value=$isofile; + ?> + + + + + + + + + + + + + +
    + $value) echo "$var=".htmlspecialchars($value)."
    ";//die; + $cnvcsv_sep=""; + if (isset($arrHttp["cnvcsv_sep"])) { + $cnvcsv_sep="-c ".$arrHttp["cnvcsv_sep"]; + } + $cnvcsv_seprep=""; + if (isset($arrHttp["cnvcsv_seprep"])) { + $cnvcsv_seprep="-r ".$arrHttp["cnvcsv_seprep"]; + } + $cnvcsv_html=""; + if (isset($arrHttp["cnvcsv_html"])) { + $cnvcsv_html="-S"; + } + $strINV=$cnvexe." -i \"$fullisoname\" -o \"$fullisonamefdt\" -d $fullfdtfile"; + $strINV.=" $cnvcsv_sep $cnvcsv_seprep -8 $cnvcsv_html 2>&1"; + echo "
    ".$msgstr["commandline"].": $strINV
    "; + ?> +
    + .... .... + + + "; + } + if($status==0) { + echo ("

    ".$msgstr["processok"]."

    "); + $auxcolor="style='color:darkgreen'"; + } else { + $auxcolor="style='color:red'"; + echo ("


    ".$msgstr["processfailed"]."

    "); + } + // show the process output in a table to get it left adjusted + ?> + + +
    > + +
    +
    +
    + + +
    + +

    :   +

    +
    + +"; +include("../common/footer.php"); +?> + + diff --git a/www/htdocs/central/utilities/inc_show_work.php b/www/htdocs/central/utilities/inc_show_work.php index 86b5c52db..6d11e862b 100644 --- a/www/htdocs/central/utilities/inc_show_work.php +++ b/www/htdocs/central/utilities/inc_show_work.php @@ -4,6 +4,7 @@ 20210702 fho4abcd added scriptaction="matchisofdt" 20210802 fho4abcd Make Show file work the first time 20211214 fho4abcd New icons. Simplified layout +20260315 fho4abcd Adde option cnvcsvtoiso */ /* ** Function : Combine the common part of actions operaing on the wrk folder @@ -13,16 +14,25 @@ ** $scriptaction=="importiso" ** $scriptaction=="cnviso2utf" ** $scriptaction=="matchisofdt"; +** $scriptaction=="cnvcsvtoiso"; */ //foreach ($_REQUEST AS $var=>$value) echo "$var=$value
    "; -if ( $scriptaction=="importiso" || $scriptaction=="matchisofdt") { +if ( $scriptaction=="importiso" || $scriptaction=="matchisofdt" || $scriptaction=="cnvcsvtoiso") { include ("../common/inc_get-dblongname.php"); include ("../common/inc_get-dbinfo.php"); $dbmsg_label=$msgstr["database"].":"; $dbmsg_value=$arrHttp["dblongname"]." (".$base.") → "; $dbmsg_value.="".$msgstr["maxmfn"].": ".$arrHttp["MAXMFN"].""; } +if ( $scriptaction=="importiso" || $scriptaction=="matchisofdt" || $scriptaction=="cnviso2utf") { + $wrkextension="iso"; + $cnv_msg=$msgstr["cnv_iso"]; +} else if ($scriptaction=="cnvcsvtoiso") { + $wrkextension="csv"; + $cnv_msg=$msgstr["cnv_csv"]; +} + $file_label=$msgstr["archivo"].": "; $file_value=$isofile; $wrkfolder_label=$msgstr["workfolder"].":"; @@ -61,7 +71,7 @@ } ?> - + @@ -78,21 +88,21 @@ ".$msgstr["archivo"]." ".$file." ".$msgstr["deleted"].""; } else { $file_array[]=$file; - $numisofiles++; + $numwrkfiles++; } } } @@ -129,7 +139,7 @@ ?> -

    +

    "; - echo "
    ".$numisofiles." ".$msgstr["filesfound"]." (".$msgstr["extension"]." = iso)"."
    "; + echo "
    ".$numwrkfiles." ".$msgstr["filesfound"]." (".$msgstr["extension"]." = ".$wrkextension.")"."
    "; } } // and here the caller must continue with the other values of $confirmcount diff --git a/www/htdocs/central/utilities/show_txt_file.php b/www/htdocs/central/utilities/show_txt_file.php new file mode 100644 index 000000000..6d5e1a924 --- /dev/null +++ b/www/htdocs/central/utilities/show_txt_file.php @@ -0,0 +1,63 @@ +$value) echo "$var=$value
    "; die; +include ("../config.php"); +$lang=$_SESSION["lang"]; + +include("../lang/admin.php");; +include("../lang/dbadmin.php");; +if (!isset($arrHttp["archivo"])) die; +$archivo=str_replace("\\","/",$arrHttp["archivo"]); + +include("../common/header.php"); +?> + + + + +
    +
    + +"; + $i=1; + foreach ($fp as $value) { + echo $i." ".$value; + $i++; + } + echo ""; +} +echo "
    "; +include("../common/footer.php"); + +?> \ No newline at end of file
    + ,)" class="bt bt-gray" title=''> + + + )" class="bt bt-gray" title=''> + +   -   + + +