从 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>

现在,很明显,这不是最好的方法。我所追求的是:

  1. 寻找相关数据
  2. 如果数据存在,则创建单元格并填写它们。

我很确定这可以用 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>