如何使用 Datatool 进行自定义排序

如何使用 Datatool 进行自定义排序

我正在编写攀岩指南,里面有一些数据。在最后一页,我想列出所有路线,并按等级排序。但传统的排序方法并不适用于此。

爬坡等级(YDS系统)的快速解释:

等级是衡量攀岩难度的一维量。等级用数字表示,从 10 级开始,又细分为四个等级,分别用字母 a、b、c 和 d 表示。

例如:8、9、10a、10c、11b

有时等级分为两级,而不是四级,用 - 和 + 符号表示。这样,等级为 10+ 的路线可能是 10c 或 10d,在表格中它应该显示在这两个等级之间。

所以我希望能够以某种方式解决这个问题。

梅威瑟:

\documentclass[12pt,a4paper]{article}

\usepackage{datatool}
\usepackage{filecontents}

\usepackage{longtable}

\begin{filecontents*}{datos.csv}
Route,Grade
Cempasúchil,9
La Gripe, 8
Dopamina infinita, 10b
Casiopea, 11c
El Hombre Avispa, 11b
Tiranosaurio Tex, 11-
Euro Dance, 11a
El Primer Contacto, 12d
\end{filecontents*}

\pagestyle{empty}

\DTLloaddb[keys={Route,Grade}]{datos}{datos.csv}
\DTLsort{Grade=ascending}{datos}

\begin{document}

{\tiny
\noindent
\begin{longtable}{ll}

  \bfseries Route & \bfseries Grade \\

  \DTLforeach{datos}{%
    \pname=Route,\pGrade=Grade}{%
    \pname & \pGrade \\
  }

\end{longtable}
}
\end{document}

输出:

在此处输入图片描述

正确的顺序:

8、9、10b、11a、11-、11b、11c、12d

解决思路:

- 拆分数字和字母,然后按两列排序。我喜欢这个解决方案,但是,它可能会在该数字的末尾放置 + 和 - 等级(我可以接受他的)。此外,我想在数据工具中进行拆分,而不是从源中进行拆分。

-也许有某种方法可以指定自定义顺序。我不介意手动输入所有可能的等级,因为等级并不多(世界上最难的路线是 15d,但对于指南来说,它们的范围从 8 到 14a)为了解决这个问题,也许可以修改或创建自定义处理程序(如 \dtlicompare)?

答案1

好吧,我设法解决了这个问题。也许这不是最优雅的方法,但对我来说很有效。

我调整了这个问题的答案:自定义字母 CSV 排序(土耳其字符)

所以主要的想法是:你可以将字符的代码更改为你想要的任何内容,以便它们以不同于 UTF8 代码的方式排序。

我改变了这些字符的代码:

Char  ----> New Code
8     ----> 1     (8 always goes first)
9     ----> 2     (9 always goes second)
a     ----> 96    (move the a back one code, to put - between a and b)
-     ----> 97    (right between a and b)
+     ----> 100   (Right after the c)
d     ----> 101   (d is displaced by the d)

如您所见,此解决方案非常具体,仅适用于我的情况,并且不能很好地概括。如果存在等级为 18 的路线,我对字符 8 和 9 所做的更改将会出现问题,因为它们将位于 10 之前。但由于这种难度不存在(并且可能永远不会存在),所以这不是问题。

也许这种方法适合阅读这个问题/答案的人。

代码(添加到序言):

\renewcommand*{\dtlsetcharcode}[2]{%
  \ifstrequal{#1}{8}%
  {%
    #2=1\relax
  }%
  {%
    \ifstrequal{#1}{9}%
    {%
      #2=2\relax
    }%
    {%
      \ifstrequal{#1}{a}%
      {%
        #2=96\relax
      }%
      {%
        \ifstrequal{#1}{-}%
        {%
          #2=97\relax
        }%
        {%
          \ifstrequal{#1}{+}%
          {%
            #2=100\relax
          }%
          {%
            \ifstrequal{#1}{d}%
            {%
              #2=101\relax
            }%
            {%
              #2=`#1\relax
            }%
          }%
        }%
      }%
    }%
  }%
}

输出:

在此处输入图片描述

相关内容