从 CSV 文件使用 Liquid 生成表格的智能方法?
Intelligent way to generate tables with Liquid from a CSV file?
好的,我会尽量简短。
我得到了一个 XML file from Musicbrainz。然后我将它转换为 CSV 并将 .
替换为 _
以使其与 Liquid 一起使用。
我把 music.csv
放在 _data
中,然后调用它:
{% include music.html %}
_includes/music.html
看起来(部分)像:
<table border="1" style="width:100%">
<tr>
<td>Artist</td>
<td>Track title</td>
</tr>
<tr>
{% if member.release_medium-list_medium_track-list_track_0_recording_artist-credit_name-credit_artist_name %}
<td>{{ member.release_medium-list_medium_track-list_track_0_recording_artist-credit_name-credit_artist_name }}</td>
{% endif %}
{% if member.release_medium-list_medium_track-list_track_0_recording_title %}
<td>{{ member.release_medium-list_medium_track-list_track_0_recording_title }}</td>
{% endif %}
</tr>
<tr>
{% if member.release_medium-list_medium_track-list_track_1_recording_artist-credit_name-credit_artist_name %}
<td>{{ member.release_medium-list_medium_track-list_track_1_recording_artist-credit_name-credit_artist_name }}</td>
{% endif %}
{% if member.release_medium-list_medium_track-list_track_1_recording_title %}
<td>{{ member.release_medium-list_medium_track-list_track_1_recording_title }}</td>
{% endif %}
</tr>
<tr>
{% if member.release_medium-list_medium_track-list_track_2_recording_artist-credit_name-credit_artist_name %}
<td>{{ member.release_medium-list_medium_track-list_track_2_recording_artist-credit_name-credit_artist_name }}</td>
{% endif %}
{% if member.release_medium-list_medium_track-list_track_2_recording_title %}
<td>{{ member.release_medium-list_medium_track-list_track_2_recording_title }}</td>
{% endif %}
</tr>
现在,很明显,这不是最好的方法。我所追求的是:
- 寻找相关数据
- 如果数据存在,则创建单元格并填写它们。
我很确定这可以用 Liquid 完成,但我不知道怎么做。有人可以帮忙吗?
编辑:原来我忘记了 CSV 文件——here it is,在 Pastebin 上。
编辑 2: This Cheat Sheet 可能会有帮助!
CSV 文件的格式本身不支持重复部分,因此我认为它不适合您尝试使用的可变长度数据格式。我觉得 JSON 更适合这个用例,因为它可以处理您尝试使用的源数据的结构。
作为一个简单示例,我将您通过 this converter 提供的 XML 文件放入输出的 JSON 版本。这被保存为“_data/music.json”。
然后使用此液体代码来解析:
{% for item in site.data.music %}
<h2> {{ item[1].release.title }}</h2>
{% for medium in item[1].release.medium-list %}
<h3> {{ medium[1].format }} </h3>
<table border="1" style="width:100%">
<tr>
<td>Artist</td>
<td>Track title</td>
</tr>
{% for track in medium[1].track-list.track %}
<tr>
<td>{{ track.recording.artist-credit.name-credit.artist.name }}</td>
<td>{{ track.recording.title }}</td>
</tr>
{% endfor %}
</table>
{% endfor %}
{% endfor %}
这会产生 HTML 像这样(修剪):
<h2> The Quatermass Film Music Collection</h2>
<h3> CD </h3>
<table border="1" style="width:100%">
<tr>
<td>Artist</td>
<td>Track title</td>
</tr>
<tr>
<td>Tristram Cary</td>
<td>Quatermass and the Pit: Opening Credits</td>
</tr>
<tr>
<td>Tristram Cary</td>
<td>Quatermass and the Pit: Bones</td>
</tr>
</table>
基于此您应该能够生成您最终想要的格式。
这是一种循环访问 csv 文件的简单方法。
<div class="table-responsive">
<table class="table">
<thead>
<tr>
{% for column in include.datafile[0] %}
<th>{{ column[0] }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for spec in include.datafile %}
<tr>
{% for value in spec %}
<td>{{ value[1] }}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
</div>
好的,我会尽量简短。
我得到了一个 XML file from Musicbrainz。然后我将它转换为 CSV 并将 .
替换为 _
以使其与 Liquid 一起使用。
我把 music.csv
放在 _data
中,然后调用它:
{% include music.html %}
_includes/music.html
看起来(部分)像:
<table border="1" style="width:100%">
<tr>
<td>Artist</td>
<td>Track title</td>
</tr>
<tr>
{% if member.release_medium-list_medium_track-list_track_0_recording_artist-credit_name-credit_artist_name %}
<td>{{ member.release_medium-list_medium_track-list_track_0_recording_artist-credit_name-credit_artist_name }}</td>
{% endif %}
{% if member.release_medium-list_medium_track-list_track_0_recording_title %}
<td>{{ member.release_medium-list_medium_track-list_track_0_recording_title }}</td>
{% endif %}
</tr>
<tr>
{% if member.release_medium-list_medium_track-list_track_1_recording_artist-credit_name-credit_artist_name %}
<td>{{ member.release_medium-list_medium_track-list_track_1_recording_artist-credit_name-credit_artist_name }}</td>
{% endif %}
{% if member.release_medium-list_medium_track-list_track_1_recording_title %}
<td>{{ member.release_medium-list_medium_track-list_track_1_recording_title }}</td>
{% endif %}
</tr>
<tr>
{% if member.release_medium-list_medium_track-list_track_2_recording_artist-credit_name-credit_artist_name %}
<td>{{ member.release_medium-list_medium_track-list_track_2_recording_artist-credit_name-credit_artist_name }}</td>
{% endif %}
{% if member.release_medium-list_medium_track-list_track_2_recording_title %}
<td>{{ member.release_medium-list_medium_track-list_track_2_recording_title }}</td>
{% endif %}
</tr>
现在,很明显,这不是最好的方法。我所追求的是:
- 寻找相关数据
- 如果数据存在,则创建单元格并填写它们。
我很确定这可以用 Liquid 完成,但我不知道怎么做。有人可以帮忙吗?
编辑:原来我忘记了 CSV 文件——here it is,在 Pastebin 上。
编辑 2: This Cheat Sheet 可能会有帮助!
CSV 文件的格式本身不支持重复部分,因此我认为它不适合您尝试使用的可变长度数据格式。我觉得 JSON 更适合这个用例,因为它可以处理您尝试使用的源数据的结构。
作为一个简单示例,我将您通过 this converter 提供的 XML 文件放入输出的 JSON 版本。这被保存为“_data/music.json”。
然后使用此液体代码来解析:
{% for item in site.data.music %}
<h2> {{ item[1].release.title }}</h2>
{% for medium in item[1].release.medium-list %}
<h3> {{ medium[1].format }} </h3>
<table border="1" style="width:100%">
<tr>
<td>Artist</td>
<td>Track title</td>
</tr>
{% for track in medium[1].track-list.track %}
<tr>
<td>{{ track.recording.artist-credit.name-credit.artist.name }}</td>
<td>{{ track.recording.title }}</td>
</tr>
{% endfor %}
</table>
{% endfor %}
{% endfor %}
这会产生 HTML 像这样(修剪):
<h2> The Quatermass Film Music Collection</h2>
<h3> CD </h3>
<table border="1" style="width:100%">
<tr>
<td>Artist</td>
<td>Track title</td>
</tr>
<tr>
<td>Tristram Cary</td>
<td>Quatermass and the Pit: Opening Credits</td>
</tr>
<tr>
<td>Tristram Cary</td>
<td>Quatermass and the Pit: Bones</td>
</tr>
</table>
基于此您应该能够生成您最终想要的格式。
这是一种循环访问 csv 文件的简单方法。
<div class="table-responsive">
<table class="table">
<thead>
<tr>
{% for column in include.datafile[0] %}
<th>{{ column[0] }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for spec in include.datafile %}
<tr>
{% for value in spec %}
<td>{{ value[1] }}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
</div>