X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Fscripts%2Fcsv2lyx.py;h=000214446173ef9c0609a2489dc05624175c9028;hb=f9f7c4a4bdab64ea5a0f31cbf7c2da68b2be9a68;hp=7fe4bf7da7a6536102f3dff42184164a43970e09;hpb=58220e118def0a9104c34892ba0c310e59b82e7f;p=lyx.git diff --git a/lib/scripts/csv2lyx.py b/lib/scripts/csv2lyx.py index 7fe4bf7da7..0002144461 100644 --- a/lib/scripts/csv2lyx.py +++ b/lib/scripts/csv2lyx.py @@ -7,7 +7,6 @@ # author Hartmut Haase # 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,30 +23,94 @@ def error(message): sys.stderr.write(message + '\n') sys.exit(1) +header = """#csv2lyx created this file +\lyxformat 276 +\\begin_document +\\begin_header +\\textclass article +\\inputencoding auto +\\font_roman default +\\font_sans default +\\font_typewriter default +\\font_default_family default +\\font_sc false +\\font_osf false +\\font_sf_scale 100 +\\font_tt_scale 100 +\\graphics default +\\paperfontsize default +\\papersize default +\\use_geometry false +\\use_amsmath 1 +\\use_esint 0 +\\cite_engine basic +\\use_bibtopic false +\\paperorientation portrait +\\secnumdepth 3 +\\tocdepth 3 +\\paragraph_separation indent +\\defskip medskip +\\papercolumns 1 +\\papersides 1 +\\paperpagestyle default +\\tracking_changes false +\\output_changes false +\\end_header + +\\begin_body + +\\begin_layout Standard +\\align left +\\begin_inset Tabular + + +""" + +cell = """ +\\begin_inset Text + +\\begin_layout Standard +%s +\\end_layout + +\\end_inset +""" + +footer = """ + +\\end_inset + + +\\end_layout + +\\end_body +\\end_document +""" + # processing command line options # delegate this to standard module optparse args = {} -args["usage"] = "Usage: csv2lyx [options] mycsvfile mytmptable.lyx" +args["usage"] = "Usage: csv2lyx [options] csvfile [file.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. +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 = 'n', column_sep = 'n', guess_sep = False) -parser.add_option("-e", "--excel", - help="""'character' Excel type, default is 'n' +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, default is ','") -parser.add_option("-g", "--guess-sep", action="store_true", - help = "guess the columns separator") +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, +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.""") + 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() @@ -56,7 +119,7 @@ parser.add_option_group(group) if len(args) == 1: infile = args[0] fout = sys.stdout -elif len(args) ==2: +elif len(args) == 2: infile = args[0] fout = open(args[1], 'w') else: @@ -66,28 +129,33 @@ else: if not os.path.exists(infile): error('File "%s" not found.' % infile) -dialects = {'n' : None, 'e' : 'excel', 't' : 'excel-tab'} +dialects = {'' : None, 'e' : 'excel', 't' : 'excel-tab'} if options.excel not in dialects: parser.print_help() sys.exit(1) -dialect= dialects[options.excel] +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 == 'n': - options.guess_sep = 'True' -print options.column_sep, options.guess_sep -if options.guess_sep: +if options.column_sep and 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) - print 'found:', dialect.delimiter - reader = csv.reader(open(infile, "rb"), dialect= dialect) + 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) + # older versions (python < 2.5) of csv have problems (bugs) + # that is why we try harder to get a result, this should work on most cases + # as it assumes that the separator is a comma (the c in csv :-) ) + try: + reader = csv.reader(open(infile, "rb"), dialect = dialect, delimiter = ',') + except: + reader = csv.reader(open(infile, "rb"), delimiter = ',') # read input num_cols = 1 # max columns @@ -97,102 +165,38 @@ for row in reader: num_cols = max(num_cols, len(row)) rows.append(row) -num_rows = reader.line_num # number of lines +num_rows = len(rows) # number of lines # create a LyX file ##################### # write first part #################### -fout.write("""#csv2lyx created this file -\lyxformat 276 -\\begin_document -\\begin_header -\\textclass article -\\inputencoding auto -\\font_roman default -\\font_sans default -\\font_typewriter default -\\font_default_family default -\\font_sc false -\\font_osf false -\\font_sf_scale 100 -\\font_tt_scale 100 -\\graphics default -\\paperfontsize default -\\papersize default -\\use_geometry false -\\use_amsmath 1 -\\use_esint 0 -\\cite_engine basic -\\use_bibtopic false -\\paperorientation portrait -\\secnumdepth 3 -\\tocdepth 3 -\\paragraph_separation indent -\\defskip medskip -\\papercolumns 1 -\\papersides 1 -\\paperpagestyle default -\\tracking_changes false -\\output_changes false -\\end_header +fout.write(header % (num_rows, num_cols)) -\\begin_body - -\\begin_layout Standard -\\align left -\\begin_inset Tabular -""") -fout.write('\n') -fout.write('\n') ##################### # write table #################### -i = 0 -while i < num_cols: +for i in range(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(""" -\\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 +for j in range(num_rows): + row = [''] -\\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(""" + ############################ + # write contents of one line + ############################ + for i in range(len(rows[j])): + row.append( cell % rows[j][i].replace('\\','\\backslash\n')) -\\end_inset + # 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') -\\end_layout - -\\end_body -\\end_document\n""") +##################### +# write last part +#################### +fout.write(footer) # close the LyX file fout.close()