forked from daleathan/ProgrammingInPython3-MarkSummerfield
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcsv2html2_ans.py
More file actions
executable file
·120 lines (103 loc) · 3.45 KB
/
csv2html2_ans.py
File metadata and controls
executable file
·120 lines (103 loc) · 3.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/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("<table border='1'>")
def print_line(line, color, maxwidth, format):
print("<tr bgcolor='{0}'>".format(color))
numberFormat = "<td align='right'>{{0:{0}}}</td>".format(format)
fields = extract_fields(line)
for field in fields:
if not field:
print("<td></td>")
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("<td>{0}</td>".format(field))
print("</tr>")
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("</table>")
main()