parent
							
								
									9b29a86bbd
								
							
						
					
					
						commit
						047da6396a
					
				|  | @ -7,6 +7,7 @@ | ||||||
|   - custom-404-page |   - custom-404-page | ||||||
|   - convert-site-to-jekyll |   - convert-site-to-jekyll | ||||||
|   - using-jekyll-with-bundler |   - using-jekyll-with-bundler | ||||||
|  |   - csv-to-table | ||||||
| 
 | 
 | ||||||
| #- title: Another section | #- title: Another section | ||||||
| #  tutorials: | #  tutorials: | ||||||
|  |  | ||||||
|  | @ -0,0 +1,214 @@ | ||||||
|  | --- | ||||||
|  | title: Show CSV as a table | ||||||
|  | author: MichaelCurrin | ||||||
|  | date: 2020-04-01 20:30:00 +0200 | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | This tutorial shows how to use Jekyll to read a CSV and render the data as an HTML table. | ||||||
|  | 
 | ||||||
|  | This approach will: | ||||||
|  | 
 | ||||||
|  | - use the CSV's first row as the HTML table header. | ||||||
|  | - use remaining rows for the body of the table. | ||||||
|  | - preserve the order of the columns from the original CSV. | ||||||
|  | - be flexible enough to work with _any_ valid CSV that is referenced. | ||||||
|  | 
 | ||||||
|  | There is no need to specify what the names of the columns are, or how many columns there are. | ||||||
|  | The trick to this tutorial is that, when we iterate over the row data, we pick up the _first row_ | ||||||
|  | and unpack that so we can get the header names. | ||||||
|  | 
 | ||||||
|  | Follow the steps below to convert a sample CSV of authors into an HTML table. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## 1. Create a CSV | ||||||
|  | 
 | ||||||
|  | Create a CSV file in your [Data files]({{ '/docs/datafiles/' | relative_url }}) directory so | ||||||
|  | that Jekyll will pick it up. A sample path and CSV data are shown below: | ||||||
|  | 
 | ||||||
|  | `_data/authors.csv` | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | First name,Last name,Age,Location | ||||||
|  | John,Doe,35,United States | ||||||
|  | Jane,Doe,29,France | ||||||
|  | Jack,Hill,25,Australia | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | That data file will now be available in Jekyll like this: | ||||||
|  | 
 | ||||||
|  | {% highlight liquid %} | ||||||
|  | {% raw %} | ||||||
|  | {{ site.data.authors }} | ||||||
|  | {% endraw %} | ||||||
|  | {% endhighlight %} | ||||||
|  | 
 | ||||||
|  | ## 2. Add a table | ||||||
|  | 
 | ||||||
|  | Choose an HTML or markdown file where you want your table to be shown. | ||||||
|  | 
 | ||||||
|  | For example: `table_test.md` | ||||||
|  | 
 | ||||||
|  | ```yaml | ||||||
|  | --- | ||||||
|  | title: Table test | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### Inspect a row | ||||||
|  | 
 | ||||||
|  | Grab the first row and see what it looks like using the `inspect` filter. | ||||||
|  | 
 | ||||||
|  | {% highlight liquid %} | ||||||
|  | {% raw %} | ||||||
|  | {% assign row = site.data.authors[0] %} | ||||||
|  | {{ row | inspect }} | ||||||
|  | {% endraw %} | ||||||
|  | {% endhighlight %} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | The result will be a _hash_ (an object consisting of key-value pairs) which looks like this: | ||||||
|  | 
 | ||||||
|  | ```ruby | ||||||
|  | { | ||||||
|  |     "First name"=>"John", | ||||||
|  |     "Last name"=>"Doe", | ||||||
|  |     "Age"=>"35", | ||||||
|  |     "Location"=>"United States" | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Note that Jekyll _does_ in fact preserve the order here, based on the original CSV. | ||||||
|  | 
 | ||||||
|  | ### Unpack a row | ||||||
|  | 
 | ||||||
|  | A simple solution would be to hardcode the field names when looking up the row values by key. | ||||||
|  | 
 | ||||||
|  | {% highlight liquid %} | ||||||
|  | {% raw %} | ||||||
|  | {{ row["First name"] }} | ||||||
|  | {{ row["Last name"] }} | ||||||
|  | {% endraw %} | ||||||
|  | {% endhighlight %} | ||||||
|  | 
 | ||||||
|  | But we prefer a solution that will work for _any_ CSV, without specifying the column names upfront. | ||||||
|  | So we iterate over the `row` object using a `for` loop: | ||||||
|  | 
 | ||||||
|  | {% highlight liquid %} | ||||||
|  | {% raw %} | ||||||
|  | {% assign row = site.data.authors[0] %} | ||||||
|  | {% for pair in row %} | ||||||
|  | {{ pair | inspect }} | ||||||
|  | {% endfor %} | ||||||
|  | {% endraw %} | ||||||
|  | {% endhighlight %} | ||||||
|  | 
 | ||||||
|  | This produces the following. Note the first item in each pair is the _key_ and the second will be | ||||||
|  | the _value_. | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | ["First name", "John"] | ||||||
|  | ["Last name", "Doe"] | ||||||
|  | ["Age", "35"] | ||||||
|  | ["Location", "United States"] | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### Create a table header row | ||||||
|  | 
 | ||||||
|  | Here we make a table with a single table row (`tr`), made up of table header (`th`) tags. We find | ||||||
|  | the header name by getting the first element (at index `0`) from `pair`. We ignore the second | ||||||
|  | element as we don't need the value yet. | ||||||
|  | 
 | ||||||
|  | {% highlight liquid %} | ||||||
|  | {% raw %} | ||||||
|  | <table> | ||||||
|  |     {% for row in site.data.authors %} | ||||||
|  |         {% if forloop.first %} | ||||||
|  |         <tr> | ||||||
|  |             {% for pair in row %} | ||||||
|  |                 <th>{{ pair[0] }}</th> | ||||||
|  |             {% endfor %} | ||||||
|  |         </tr> | ||||||
|  |         {% endif %} | ||||||
|  |     {% endfor %} | ||||||
|  | </table> | ||||||
|  | {% endraw %} | ||||||
|  | {% endhighlight %} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | For now,s we do not display any content for the second row onwards - we achieve this by using | ||||||
|  | `forloop.first`, since this will return true for the _first_ row and false otherwise. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### Add table data rows | ||||||
|  | 
 | ||||||
|  | In this section we add the data rows to the table. Now, we use the second element of `pair` | ||||||
|  | to find the value. | ||||||
|  | 
 | ||||||
|  | For convenience, we render using the `tablerow` tag - this works like a `for` loop, but the inner | ||||||
|  | data will be rendered with `tr` and `td` HTML tags for us. Unfortunately, there is no equivalent for | ||||||
|  | the header row, so we must write that out in full, as in the previous section. | ||||||
|  | 
 | ||||||
|  | {% highlight liquid %} | ||||||
|  | {% raw %} | ||||||
|  | --- | ||||||
|  | title: Table test | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | <table> | ||||||
|  |     {% for row in site.data.authors %} | ||||||
|  |         {% if forloop.first %} | ||||||
|  |         <tr> | ||||||
|  |             {% for pair in row %} | ||||||
|  |             <th>{{ pair[0] }}</th> | ||||||
|  |             {% endfor %} | ||||||
|  |         </tr> | ||||||
|  |         {% endif %} | ||||||
|  | 
 | ||||||
|  |         {% tablerow pair in row %} | ||||||
|  |             {{ pair[1] }} | ||||||
|  |         {% endtablerow %} | ||||||
|  |     {% endfor %} | ||||||
|  | </table> | ||||||
|  | {% endraw %} | ||||||
|  | {% endhighlight %} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | With the code above, our output table should look like this: | ||||||
|  | 
 | ||||||
|  | <table> | ||||||
|  |     <tr> | ||||||
|  |         <th>First name</th> | ||||||
|  |         <th>Last name</th> | ||||||
|  |         <th>Age</th> | ||||||
|  |         <th>Location</th> | ||||||
|  |     </tr> | ||||||
|  |     <tr> | ||||||
|  |         <td>John</td> | ||||||
|  |         <td>Doe</td> | ||||||
|  |         <td>35</td> | ||||||
|  |         <td>United States</td> | ||||||
|  |     </tr> | ||||||
|  |     <tr> | ||||||
|  |         <td>Jane</td> | ||||||
|  |         <td>Doe</td> | ||||||
|  |         <td>29</td> | ||||||
|  |         <td>France</td> | ||||||
|  |     </tr> | ||||||
|  |     <tr> | ||||||
|  |         <td>Jack</td> | ||||||
|  |         <td>Hill</td> | ||||||
|  |         <td>25</td> | ||||||
|  |         <td>Australia</td> | ||||||
|  |     </tr> | ||||||
|  | </table> | ||||||
|  | 
 | ||||||
|  | That's it - you can now turn a CSV into an HTML table using Jekyll. | ||||||
|  | 
 | ||||||
|  | ## Next steps | ||||||
|  | 
 | ||||||
|  | - Change the field names in the CSV. | ||||||
|  | - Choose a different CSV. | ||||||
|  | - Add CSS styling to your table. | ||||||
|  | - Render the table using a JSON or YAML input file. | ||||||
		Loading…
	
		Reference in New Issue