diff --git a/lib/scripts/csv2lyx.py b/lib/scripts/csv2lyx.py index 7fe4bf7da7..2e8bbbb1d8 100644 --- a/lib/scripts/csv2lyx.py +++ b/lib/scripts/csv2lyx.py @@ -6,8 +6,8 @@ # Licence details can be found in the file COPYING. # author Hartmut Haase +# author Uwe Stöhr # author José Matos - # Full author contact details are available in file CREDITS # This script reads a csv-table (file name.csv) and converts it into @@ -24,86 +24,7 @@ def error(message): sys.stderr.write(message + '\n') sys.exit(1) -# processing command line options -# delegate this to standard module optparse -args = {} -args["usage"] = "Usage: csv2lyx [options] mycsvfile mytmptable.lyx" - -args["description"] = """This script creates a LyX document containing a table -from a comma-separated-value file. The LyX file has format 276 -and can be opened with LyX 1.5.0 and newer. -""" -parser = optparse.OptionParser(**args) - -parser.set_defaults(excel = 'n', column_sep = 'n', guess_sep = False) -parser.add_option("-e", "--excel", - help="""'character' Excel type, default is 'n' - 'e': Excel-generated CSV file - 't': Excel-generated TAB-delimited CSV file""") -parser.add_option("-s", "--separator", dest="column_sep", - help= "column separator, default is ','") -parser.add_option("-g", "--guess-sep", action="store_true", - help = "guess the columns separator") - -group = optparse.OptionGroup(parser, "Remarks", """If your .csv file contains special characters (e. g. umlauts, - accented letters, etc.) make sure it is coded in UTF-8 (unicode). - Else LyX will loose some cell contents. If your .csv file was not written according to the "Common Format and MIME Type for Comma-Separated Values (CSV) Files" (http://tools.ietf.org/html/rfc4180) there may be unexpected results.""") -parser.add_option_group(group) - -(options, args) = parser.parse_args() - -# validate input -if len(args) == 1: - infile = args[0] - fout = sys.stdout -elif len(args) ==2: - infile = args[0] - fout = open(args[1], 'w') -else: - parser.print_help() - sys.exit(1) - -if not os.path.exists(infile): - error('File "%s" not found.' % infile) - -dialects = {'n' : None, 'e' : 'excel', 't' : 'excel-tab'} -if options.excel not in dialects: - parser.print_help() - sys.exit(1) -dialect= dialects[options.excel] - -# when no special column separator is given, try to detect it: -if options.column_sep == 'n': - options.guess_sep = 'True' -print options.column_sep, options.guess_sep -if options.guess_sep: - guesser = csv.Sniffer() - input_file = "".join(open(infile,'rb').readlines()) - try: - dialect = guesser.sniff(input_file) - print 'found:', dialect.delimiter - reader = csv.reader(open(infile, "rb"), dialect= dialect) - except: - print 'error, using ,' - reader = csv.reader(open(infile, "rb"), dialect= dialect, delimiter=',') -else: - reader = csv.reader(open(infile, "rb"), dialect= dialect, delimiter=options.column_sep) - -# read input -num_cols = 1 # max columns -rows = [] - -for row in reader: - num_cols = max(num_cols, len(row)) - rows.append(row) - -num_rows = reader.line_num # number of lines - -# create a LyX file -##################### -# write first part -#################### -fout.write("""#csv2lyx created this file +header = """#csv2lyx created this file \lyxformat 276 \\begin_document \\begin_header @@ -142,50 +63,21 @@ fout.write("""#csv2lyx created this file \\begin_layout Standard \\align left \\begin_inset Tabular -""") -fout.write('\n') -fout.write('\n') -##################### -# write table -#################### -i = 0 -while i < num_cols: - fout.write('\n') - i += 1 -j = 0 -while j < num_rows: - fout.write('\n') - num_cols_2 = len(rows[j]) # columns in current row - #print j, ': ' , rows[j] -############################ -# write contents of one line -############################ - i = 0 - while i < num_cols_2: - fout.write(""" + + +""" + +cell = """ \\begin_inset Text -\\begin_layout Standard\n""") - #print rows[j][i] - fout.write(rows[j][i]) - fout.write('\n\\end_layout\n\n\\end_inset\n\n') - i += 1 -# If row has less columns than num_cols - if num_cols_2 < num_cols: - while i < num_cols: - fout.write(""" -\\begin_inset Text +\\begin_layout Standard +%s +\\end_layout -\\begin_layout Standard\n""") - fout.write(' ') - fout.write('\n\\end_layout\n\n\\end_inset\n\n') - i += 1 - fout.write('\n') - j += 1 -##################### -# write last part -#################### -fout.write(""" +\\end_inset +""" + +footer = """ \\end_inset @@ -193,6 +85,113 @@ fout.write(""" \\end_layout \\end_body -\\end_document\n""") +\\end_document +""" + +# processing command line options +# delegate this to standard module optparse +args = {} +args["usage"] = "Usage: csv2lyx [options] csvfile [file.lyx]" + +args["description"] = """This script creates a LyX document containing a table created from a +comma-separated-value (CSV) file. The resulting LyX file can be opened +with LyX 1.5.0 or any later version. +If no options are given csv2lyx will try to infer the CSV type of the csvfile, +""" +parser = optparse.OptionParser(**args) + +parser.set_defaults(excel='', column_sep='') +parser.add_option("-e", "--excel", metavar="CHAR", + help="""CHAR corresponds to a CSV type: + 'e': Excel-generated CSV file + 't': Excel-generated TAB-delimited CSV file""") +parser.add_option("-s", "--separator", dest="column_sep", + help= """column separator + 't' means Tab""") + +group = optparse.OptionGroup(parser, "Remarks", """If your CSV file contains special characters (e. g. umlauts, + accented letters, etc.) make sure it is coded in UTF-8 (unicode). + Else LyX will loose some cell contents. If your CSV file was not written according to the "Common Format and MIME Type for Comma-Separated Values (CSV) Files" (http://tools.ietf.org/html/rfc4180) there may be unexpected results.""") +parser.add_option_group(group) + +(options, args) = parser.parse_args() + +# validate input +if len(args) == 1: + infile = args[0] + fout = sys.stdout +elif len(args) ==2: + infile = args[0] + fout = open(args[1], 'w') +else: + parser.print_help() + sys.exit(1) + +if not os.path.exists(infile): + error('File "%s" not found.' % infile) + +dialects = {'' : None, 'e' : 'excel', 't' : 'excel-tab'} +if options.excel not in dialects: + parser.print_help() + sys.exit(1) +dialect= dialects[options.excel] + +# Set Tab, if necessary +if options.column_sep == 't': + options.column_sep = "\t" + +# when no special column separator is given, try to detect it: +if options.column_sep or dialect : + reader = csv.reader(open(infile, "rb"), dialect= dialect, delimiter=options.column_sep) +else: + guesser = csv.Sniffer() + input_file = "".join(open(infile,'rb').readlines()) + try: + dialect = guesser.sniff(input_file) + reader = csv.reader(open(infile, "rb"), dialect= dialect) + except: + reader = csv.reader(open(infile, "rb"), dialect= dialect, delimiter=',') + +# read input +num_cols = 1 # max columns +rows = [] + +for row in reader: + num_cols = max(num_cols, len(row)) + rows.append(row) + +num_rows = reader.line_num # number of lines + +# create a LyX file +##################### +# write first part +#################### +fout.write(header % (num_rows, num_cols)) + +##################### +# write table +#################### +for i in range(num_cols): + fout.write('\n') + +for j in range(num_rows): + row = [''] + + ############################ + # write contents of one line + ############################ + for i in range(len(rows[j])): + row.append( cell % rows[j][i]) + + # If row has less columns than num_cols fill with blank entries + for i in range(len(rows[j]), num_cols): + row.append(cell % " ") + + fout.write("\n".join(row) + '\n\n') + +##################### +# write last part +#################### +fout.write(footer) # close the LyX file fout.close()