CSV to HTML translation: Difference between revisions
m (html lang) |
m (tidy up) |
||
Line 9: | Line 9: | ||
and returns a text string of an HTML table representing the CSV data. Use the following |
and returns a text string of an HTML table representing the CSV data. Use the following |
||
data as the CSV text to convert, and show your output. |
data as the CSV text to convert, and show your output. |
||
:Character, |
:Character,Speech |
||
:The multitude,The messiah! Show us the messiah! |
:The multitude,The messiah! Show us the messiah! |
||
:Brians mother,<angry>Now you listen here! He's not the messiah; he's a very naughty boy! Now go away!</angry> |
:Brians mother,<angry>Now you listen here! He's not the messiah; he's a very naughty boy! Now go away!</angry> |
||
Line 23: | Line 23: | ||
===Simple solution=== |
===Simple solution=== |
||
<lang python>csvtxt = '''\ |
<lang python>csvtxt = '''\ |
||
Character, |
Character,Speech |
||
The multitude,The messiah! Show us the messiah! |
The multitude,The messiah! Show us the messiah! |
||
Brians mother,<angry>Now you listen here! He's not the messiah; he's a very naughty boy! Now go away!</angry> |
Brians mother,<angry>Now you listen here! He's not the messiah; he's a very naughty boy! Now go away!</angry> |
||
Line 52: | Line 52: | ||
'''Sample (rendered) HTML output''' |
'''Sample (rendered) HTML output''' |
||
<lang html><TABLE summary="csv2html program output"> |
<lang html><TABLE summary="csv2html program output"> |
||
<TBODY><TR><TD>Character</TD><TD> |
<TBODY><TR><TD>Character</TD><TD>Speech</TD></TR></TBODY> |
||
<TBODY><TR><TD>The multitude</TD><TD>The messiah! Show us the messiah!</TD></TR></TBODY> |
<TBODY><TR><TD>The multitude</TD><TD>The messiah! Show us the messiah!</TD></TR></TBODY> |
||
<TBODY><TR><TD>Brians mother</TD><TD><angry>Now you listen here! He's not the messiah; he's a very naughty boy! Now go away!</angry></TD></TR></TBODY> |
<TBODY><TR><TD>Brians mother</TD><TD><angry>Now you listen here! He's not the messiah; he's a very naughty boy! Now go away!</angry></TD></TR></TBODY> |
||
Line 61: | Line 60: | ||
<TBODY><TR><TD>The multitude</TD><TD>Behold his mother! Behold his mother!</TD></TR></TBODY> |
<TBODY><TR><TD>The multitude</TD><TD>Behold his mother! Behold his mother!</TD></TR></TBODY> |
||
</TABLE></lang> |
</TABLE></lang> |
||
===Extra credit solution=== |
===Extra credit solution=== |
||
Line 96: | Line 94: | ||
'''Sample HTML output''' |
'''Sample HTML output''' |
||
<!-- |
|||
The raw HTML would not render correctly through the wiki interface but shows a suitably coloured table with cell borders. |
|||
--> |
|||
<lang html><TABLE border="1" summary="csv2html extra program output"> |
<lang html><TABLE border="1" summary="csv2html extra program output"> |
||
<THEAD bgcolor="yellow"><TR><TD>Character</TD><TD> |
<THEAD bgcolor="yellow"><TR><TD>Character</TD><TD>Speech</TD></TR></THEAD> |
||
<TBODY bgcolor="orange"><TR><TD>The multitude</TD><TD>The messiah! Show us the messiah!</TD></TR></TBODY> |
<TBODY bgcolor="orange"><TR><TD>The multitude</TD><TD>The messiah! Show us the messiah!</TD></TR></TBODY> |
||
<TBODY bgcolor="orange"><TR><TD>Brians mother</TD><TD><angry>Now you listen here! He's not the messiah; he's a very naughty boy! Now go away!</angry></TD></TR></TBODY> |
<TBODY bgcolor="orange"><TR><TD>Brians mother</TD><TD><angry>Now you listen here! He's not the messiah; he's a very naughty boy! Now go away!</angry></TD></TR></TBODY> |
Revision as of 13:50, 13 November 2010
Consider a simplified CSV format where all rows are separated by a newline and all columns are separated by commas. No commas are allowed as field data, but the data may contain other characters and character sequences that would normally be escaped when converted to HTML
The task is to create a function that takes a string representation of the CSV data and returns a text string of an HTML table representing the CSV data. Use the following data as the CSV text to convert, and show your output.
- Character,Speech
- The multitude,The messiah! Show us the messiah!
- Brians mother,<angry>Now you listen here! He's not the messiah; he's a very naughty boy! Now go away!</angry>
- The multitude,Who are you?
- Brians mother,I'm his mother; that's who!
- The multitude,Behold his mother! Behold his mother!
For extra credit, optionally allow special formatting for the first row of the table as if it is the tables header row.
Python
Simple solution
<lang python>csvtxt = \ Character,Speech The multitude,The messiah! Show us the messiah! Brians mother,<angry>Now you listen here! He's not the messiah; he's a very naughty boy! Now go away!</angry> The multitude,Who are you? Brians mother,I'm his mother; that's who! The multitude,Behold his mother! Behold his mother!\
from cgi import escape
def _row2tr(row, attr=None):
cols = escape(row).split(',')
return ('' + .join('%s' % data for data in cols) + '') def csv2html(txt): htmltxt = '
\n' for rownum, row in enumerate(txt.split('\n')): htmlrow = _row2tr(row) htmlrow = ' <TBODY>%s</TBODY>\n' % htmlrow htmltxt += htmlrow htmltxt += '\n'
return htmltxt
htmltxt = csv2html(csvtxt) print(htmltxt)</lang>
Sample (rendered) HTML output
<lang html>
<TBODY></TBODY> <TBODY></TBODY> <TBODY></TBODY> <TBODY></TBODY> <TBODY></TBODY> <TBODY></TBODY>Character | Speech |
The multitude | The messiah! Show us the messiah! |
Brians mother | <angry>Now you listen here! He's not the messiah; he's a very naughty boy! Now go away!</angry> |
The multitude | Who are you? |
Brians mother | I'm his mother; that's who! |
The multitude | Behold his mother! Behold his mother! |
</lang>
Extra credit solution
<lang python>def _row2trextra(row, attr=None):
cols = escape(row).split(',') attr_tr = attr.get('TR', ) attr_td = attr.get('TD', ) return (('<TR%s>' % attr_tr)
+ .join('<TD%s>%s' % (attr_td, data) for data in cols) + '') def csv2htmlextra(txt, header=True, attr=None): ' attr is a dictionary mapping tags to attributes to add to that tag' attr_table = attr.get('TABLE', ) attr_thead = attr.get('THEAD', ) attr_tbody = attr.get('TBODY', ) htmltxt = '<TABLE%s>\n' % attr_table for rownum, row in enumerate(txt.split('\n')): htmlrow = _row2trextra(row, attr) rowclass = ('THEAD%s' % attr_thead) if (header and rownum == 0) else ('TBODY%s' % attr_tbody) htmlrow = ' <%s>%s</%s>\n' % (rowclass, htmlrow, rowclass[:5]) htmltxt += htmlrow htmltxt += '\n'
return htmltxt
htmltxt = csv2htmlextra(csvtxt, True,
dict(TABLE=' border="1" summary="csv2html extra program output"', THEAD=' bgcolor="yellow"', TBODY=' bgcolor="orange"' ) )
print(htmltxt)</lang>
Sample HTML output
<lang html>
<THEAD bgcolor="yellow"></THEAD> <TBODY bgcolor="orange"></TBODY> <TBODY bgcolor="orange"></TBODY> <TBODY bgcolor="orange"></TBODY> <TBODY bgcolor="orange"></TBODY> <TBODY bgcolor="orange"></TBODY>Character | Speech |
The multitude | The messiah! Show us the messiah! |
Brians mother | <angry>Now you listen here! He's not the messiah; he's a very naughty boy! Now go away!</angry> |
The multitude | Who are you? |
Brians mother | I'm his mother; that's who! |
The multitude | Behold his mother! Behold his mother! |
</lang>