#!/usr/bin/env python3 # Copyright (c) 2008-11 Qtrac Ltd. All rights reserved. # This program or module is free software: you can redistribute it and/or # modify it under the terms of the GNU General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. It is provided for educational # purposes and is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. import sys import xml.sax.saxutils def main(): maxwidth, format = process_options() if maxwidth is not None: print_start() count = 0 while True: try: line = input() if count == 0: color = "lightgreen" elif count % 2: color = "white" else: color = "lightyellow" print_line(line, color, maxwidth, format) count += 1 except EOFError: break print_end() def process_options(): maxwidth_arg = "maxwidth=" format_arg = "format=" maxwidth = 100 format = ".0f" for arg in sys.argv[1:]: if arg in ["-h", "--help"]: print("""\ usage: csv2html.py [maxwidth=int] [format=str] < infile.csv > outfile.html maxwidth is an optional integer; if specified, it sets the maximum number of characters that can be output for string fields, otherwise a default of {0} characters is used. format is the format to use for numbers; if not specified it defaults to "{1}".""".format(maxwidth, format)) return None, None elif arg.startswith(maxwidth_arg): try: maxwidth = int(arg[len(maxwidth_arg):]) except ValueError: pass elif arg.startswith(format_arg): format = arg[len(format_arg):] return maxwidth, format def print_start(): print("") def print_line(line, color, maxwidth, format): print("".format(color)) numberFormat = "".format(format) fields = extract_fields(line) for field in fields: if not field: print("") else: number = field.replace(",", "") try: x = float(number) print(numberFormat.format(x)) except ValueError: field = field.title() field = field.replace(" And ", " and ") if len(field) <= maxwidth: field = xml.sax.saxutils.escape(field) else: field = "{0} ...".format( xml.sax.saxutils.escape(field[:maxwidth])) print("".format(field)) print("") def extract_fields(line): fields = [] field = "" quote = None for c in line: if c in "\"'": if quote is None: quote = c elif quote == c: quote = None else: field += c continue if quote is None and c == ",": fields.append(field) field = "" else: field += c if field: fields.append(field) return fields def print_end(): print("
{{0:{0}}}{0}
") main()