
¿Cómo puedo obtener todos los valores diferentes de una columna específica en una datatool
base de datos? Un ejemplo es la siguiente tabla leída en una datatool
base de datos:
Name,Town,Age
Adam,Xcity,20
Berta,Ytown,30
Cesar,Ztington,40
Dora,Ztington,20
Emil,Ytown,30
Franz,Ytown,20
Ahora me gustaría obtener una lista de todas las ciudades ( Xcity, Ytown,Ztington
) en esa base de datos y de todas las edades ( 20,30,40
) en esa base de datos sin duplicados, que puedo almacenar en macro/lo que sea para reutilizar más tarde con datatool
o pgffor
.
Respuesta1
datatool
tiene una macro llamada \DTLifinlist
que puede verificar si un elemento está en la lista separada por comas dada, por lo que se puede usar al construir una lista de todas las ciudades o edades, como esta:
\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}
Resultado: