
Wie kann ich alle unterschiedlichen Werte einer bestimmten Spalte in einer datatool
Datenbank abrufen? Beispiel: Die folgende Tabelle wird in eine datatool
Datenbank eingelesen:
Name,Town,Age
Adam,Xcity,20
Berta,Ytown,30
Cesar,Ztington,40
Dora,Ztington,20
Emil,Ytown,30
Franz,Ytown,20
Jetzt möchte ich eine Liste aller Städte ( Xcity, Ytown,Ztington
) und aller Altersgruppen ( 20,30,40
) in dieser Datenbank ohne Duplikate erhalten, die ich in einem Makro/was auch immer speichern kann, um sie später mit datatool
oder wiederzuverwenden pgffor
.
Antwort1
datatool
verfügt über ein Makro namens \DTLifinlist
, das prüfen kann, ob ein Element in der angegebenen, durch Kommas getrennten Liste enthalten ist. Dies kann daher beim Erstellen einer Liste aller Städte oder Altersgruppen wie folgt verwendet werden:
\documentclass{article}
\usepackage{etoolbox}
\usepackage{datatool}
\begin{filecontents}{test.csv}
Name,Town,Age
Adam,Xcity,20
Berta,Ytown,30
Cesar,Ztington,40
Dora,Ztington,20
Emil,Ytown,30
Franz,Ytown,20
\end{filecontents}
\DTLloaddb{data}{test.csv}
\begin{document}
\newcommand*{\uniquetowns}{}
\newcommand*{\uniqueages}{}
\DTLforeach*{data}{\Town=Town,\Age=Age}{%
\expandafter\DTLifinlist\expandafter{\Town}{\uniquetowns}%
{}% do nothing, already in list
{% add to list
\ifdefempty{\uniquetowns}%
{\let\uniquetowns\Town}% first element of list
{% append to list
\eappto\uniquetowns{,\Town}%
}%
}%
% Similarly for age
\expandafter\DTLifinlist\expandafter{\Age}{\uniqueages}%
{}% do nothing, already in list
{% add to list
\ifdefempty{\uniqueages}%
{\let\uniqueages\Age}% first element of list
{% append to list
\eappto\uniqueages{,\Age}%
}%
}%
}
List of unique towns: \uniquetowns.
List of unique ages: \uniqueages.
\end{document}
Ergebnis: