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

时间:2016-02-29 18:56:37

标签: csv jekyll liquid alphabetical-sort

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

A

  • 苹果
  • 箭头

  • 模糊

依旧......

这是我显示有序数据的代码。

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

输出:

        
  • 再次:现在就在这里
  •     
  • 阿姨:两个人的另一个解释
  •     
  • 借用:来自某人的东西
  •     
  • 兄弟:一个新的解释
  •     
  • 父亲:就是这样
  •     
  • 禁止:水果
  •     
  • 叔叔:最后一个三个,使用逗号fin
  •     
  • 犹他州:这是一个州

1 个答案:

答案 0 :(得分:2)

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

试试这个:

{% 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截断字符串,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>正确,你可能会自己开始工作)

  

代码运行良好,但只有csv文件已按字母顺序排序,我需要代码同时执行第一个字母的排序和添加。

好的,那么你需要结合你的代码和我的代码,即你需要应用我的“确定第一个字母是否已更改”部分到你的{% 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%完成的解决方案,您仍需要弄清楚当第一个字母发生变化时如何结束/启动<ul>部分。

另外,开头有一个空的<li>,可能是因为你用空字符串分割而thelistings包含很多的空字符串(因为这一行) {% capture thelistings %}...{% endcapture %}内的中断和缩进。

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