그래서 제가 작성하고 있는 암벽등반 가이드에 대한 데이터가 있습니다. 마지막 페이지에는 등급별로 정렬된 모든 경로를 나열하고 싶습니다. 문제는 여기에는 기존 정렬이 적용되지 않는다는 것입니다.
등반 등급에 대한 간단한 설명(YDS 시스템):
등급은 암벽 등반의 난이도를 나타내는 1차원 수량입니다. 등급은 숫자로 표시되며, 10학년부터는 문자 a, b, c, d로 표시되는 4등급으로 세분화됩니다.
예: 8, 9, 10a, 10c, 11b
때로는 성적이 4개가 아닌 2개로 나뉘며 - 및 + 기호로 표시됩니다. 이렇게 하면 10+ 등급의 경로가 10c 또는 10d가 될 수 있으며 표에서는 해당 등급 사이에 표시되어야 합니다.
그래서 나는 이것을 어떻게든 정리할 수 있기를 원합니다.
MWE:
\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, 10ㄴ, 11a, 11-, 11b, 11c, 12d
솔루션 아이디어:
-숫자와 문자를 분리하여 2열로 정렬합니다. 나는 이 솔루션을 좋아하지만 아마도 그 숫자 끝에 + 및 - 등급을 넣을 것입니다(나는 그와 함께 살 수 있습니다). 또한 소스가 아닌 datatool에서 이 분할을 수행하고 싶습니다.
- 어쩌면 맞춤 주문을 지정하는 방법이 있을 수도 있습니다. 가능한 모든 등급을 직접 입력해야 하는 것은 괜찮습니다. 그렇게 많지는 않습니다(세계에서 가장 어려운 경로는 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)
보시다시피 이 솔루션은 내 상황에 매우 구체적이며 일반화되지 않습니다. 캐릭터 8과 9에 적용한 변경 사항은 등급이 18인 경로가 존재하는 경우 문제가 될 수 있습니다. 왜냐하면 등급이 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
}%
}%
}%
}%
}%
}%
}
산출: