Draw an SQL Output Table

12

0

I'm sure most of us have seen SQL results in a terminal, all neatly formatted into rows and columns. If you haven't, here's an example:

+----------+-----------+----------------+
| column 1 | column 2  | column 3       |
+----------+-----------+----------------+
| data     | more data | even more data |
| etc      | just goes | on and on      |
+----------+-----------+----------------+

Your goal for this challenge is, given the columns and row data for a table, draw the table in this style. There should be a horizontal line at the top and bottom of the table, and one right below the header row. There should be vertical lines between every column, and one on both sides of the table. You should use pipes for vertical lines, hyphens for horizontal lines, and plusses for where they intersect.

Specifics:

  • The data can be entered via stdin, or as the argument to a function, but it must be in some form of string
  • The data should be split by the string delimiter ;
  • The data will consist of only ASCII characters, is not quoted, and will not contain the delimiter.
  • The first row of the data will be used for column headers
  • The data will always have the same number of columns
  • The input will always contain at least two rows (one header, one data). You do not have to handle empty sets.
  • A trailing or preceding newline is permitted
  • Each column should be as wide as the widest element, padding shorter elements on the right (bonus -5% if you pad numbers on the left)
  • There should be 1 space of padding before and after the headers and data, except when the column is wider
  • You are not allowed to use the actual mysql program to generate the table
  • Standard loopholes apply

Sample Input:

column 1;column 2;column 3
hello;world;test
longer data;foo;bar

Output

+-------------+----------+----------+
| column 1    | column 2 | column 3 |
+-------------+----------+----------+
| hello       | world    | test     |
| longer data | foo      | bar      |
+-------------+----------+----------+

Scoring:

Lowest number of bytes wins, of course. -5% bonus for padding numbers on the left (see specifics).

Glenn Smith

Posted 2015-09-12T02:37:40.133

Reputation: 585

Are they any time limits on the program run time? – Downgoat – 2015-09-12T04:39:18.213

Nope; take as long as you want, as long as it actually finishes. – Glenn Smith – 2015-09-12T04:55:26.097

1What should the output be if there's only one row of input? – Zgarb – 2015-09-12T15:53:07.623

You can assume that there will always be at least two rows of input. MySQL doesn't even display a table for an empty set; you don't have to either. – Glenn Smith – 2015-09-12T17:18:46.260

Answers

2

CJam, 67 58 bytes

' qN/';f/ff+z_.{[z,):TS*'|+f.e|T'-*'++:T\(T@~T]}z{s_W=\N}/

Try it online in the CJam interpreter.

Dennis

Posted 2015-09-12T02:37:40.133

Reputation: 196 637

2

JavaScript (ES6), 262 bytes

f=x=>{w=[],o=z=>y(`| ${z[m]((c,i)=>(c+' '.repeat(w[i]-c.length))).join` | `} |`),(d=x.split`
`[m='map'](r=>r.split`;`))[m](r=>r[m]((c,i)=>w[i]=Math.max(c.length,w[i]||0)));(y=console.log)(s=`+${w[m](c=>'-'.repeat(c+2)).join`+`}+`);o(d.shift());y(s);d[m](o);y(s)}

Demo

Since it is ES6, this demo works in Firefox and Edge at this time. For some reason it does not work in Chrome/Opera even with experimental JavaScript features enabled.

// Snippet stuff
console.log = x => document.getElementsByTagName('output')[0].innerHTML += x + '\n';
document.getElementsByTagName('button')[0].addEventListener('click', () => {
  f(document.getElementById('I').value);
});


// Actual code
f = x => {
  w = [], o = z => y(`| ${z[m]((c,i)=>(c+' '.repeat(w[i]-c.length))).join` | `} |`), (d = x.split `
` [m = 'map'](r => r.split `;`))[m](r => r[m]((c, i) => w[i] = Math.max(c.length, w[i] || 0)));
  (y = console.log)(s = `+${w[m](c=>'-'.repeat(c+2)).join`+`}+`);
  o(d.shift());
  y(s);
  d[m](o);
  y(s)
}
<p>
  <textarea id=I cols=80 rows=15>column 1;column 2;column 3
hello;world;test
longer data;foo;bar</textarea>
</p>
<button type=button>Go</button>
<pre><output></output></pre>

rink.attendant.6

Posted 2015-09-12T02:37:40.133

Reputation: 2 776