所以我有一些我正在寫的攀岩指南的數據。在最後一頁中,我想列出所有路線,按等級排序。問題是傳統的排序在這裡不適用。
攀登等級快速說明(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 按字母順序排序(土耳其語字元)
所以主要想法是:yoo 可以將字元的程式碼變更為您想要的任何內容,以便它們以與 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
}%
}%
}%
}%
}%
}%
}
輸出: