如何按首字母对数据进行分组并从液体中的 .csv 文件中按字母顺序排列?

How to group data by first letter and order it alphabetically from a .csv file in liquid?

我已经设法按字母顺序排列所有数据,但我不能做的是按首字母分组并显示首字母,如下所示:

一个

B

等等...

这是我显示订购数据的代码。

---
layout: default
---
{% capture thelistings %}
  {% for listing in site.data.terminology %}
    <li>{{ listing.term }}: {{ listing.definition }}</li>
  {% endfor %}
{% endcapture %}
{% assign allsortedlistings = thelistings | split:"   " | sort %}

    <ul>
{% for allterms in allsortedlistings %}
        {{ allterms }}
{% endfor %}
    </ul>

这输出:

嗯,你需要检查某处当前术语的首字母是否与上一个术语的首字母不同。

试试这个:

{% assign lastletter = "" %}

{% for listing in site.data.terminology %}

    {% assign tmpletter = listing.term | slice: 0 | upcase %}

    {% if tmpletter != lastletter %}
        <h1>{{ tmpletter }}</h1>
    {% endif %}

    {{ listing.term }}: {{ listing.definition }}<br>

    {% assign lastletter = tmpletter %}

{% endfor %}

我只是将当前术语的第一个字母保存到变量tmpletter
(slice truncates the string and upcase转成大写因为我想显示大写)

然后,如果它与上一个词的第一个字母不同,我就显示它。

HTML 输出:

<h1>A</h1>
again: now it is here<br>
aunt: another explanation for two<br>
<h1>B</h1>
borrow: something from someone<br>
brother: new explanation for one<br>
<h1>F</h1>
father: this is it<br>
forbidden: fruit<br>
<h1>U</h1>
uncle: and last one for three, with the use of comma fin<br>
utah: this is a state<br>

(我没有费心把 <ul><li> 的东西弄好,你可能会自己搞定它)


the code works well but only if the csv file is already ordered alphabetically, I need the code to do both the ordering and the adding of the first letter.

好的,那么你需要结合你的代码和我的代码,即你需要将我的 "determine whether the first letter changed" 部分应用到你的 {% for allterms in allsortedlistings %} 部分。

像这样:

{% capture thelistings %}
  {% for listing in site.data.terminology %}
    {{ listing.term }}: {{ listing.definition }}
  {% endfor %}
{% endcapture %}
{% assign allsortedlistings = thelistings | split:"   " | sort %}

{% assign lastletter = "" %}

    <ul>
{% for allterms in allsortedlistings %}

    {% assign tmpletter = allterms | strip | slice: 0 | upcase %}

    {% if tmpletter != lastletter %}
        <li>{{ tmpletter }}</li>
    {% endif %}

        <li>{{ allterms }}</li>

    {% assign lastletter = tmpletter %}

{% endfor %}
    </ul>

这不是 100% 完成的解决方案,您仍然需要弄清楚如何在首字母更改时 end/start <ul> 部分。

此外,开头有一个空的 <li>,可能是因为您按空字符串拆分并且 thelistings 包含 lot 个空字符串(因为 {% capture thelistings %}...{% endcapture %}.

里面的换行符和缩进

(出于同样的原因,我需要 strip {% assign tmpletter = ... 行中字符串中的所有空格,以找到第一个不是空格的字符)