Criando array de strings a partir de arquivo csv

Criando array de strings a partir de arquivo csv

Eu gostaria de criar alguns crachás usando um loop. Tenho uma planilha com nomes e afiliações que salvo no arquivo nomes.csv da seguinte forma

"Name1","Surname1","Affiliation1",
"Name2","Surname2","Affiliation2",
"Name3","Surname3","Affiliation3"

Posso copiar o conteúdo denames.csv em uma matriz de strings e usar um loop para recuperar as entradas. A seguir está um exemplo de código funcional que produz a saída Surname2:

\documentclass{article}
\usepackage{tikz}
\usepackage{pgf}
\usepackage{array}

\def\names{{"Name1","Surname1","Affiliation1",
"Name2","Surname2","Affiliation2",
"Name3","Surname3","Affiliation3"}}

\begin{document}

\pgfmathparse{\names[4]}\pgfmathresult

\end{document}

Posso usar essa ideia para criar centenas de crachás em um loop. Mas em vez de escrever a lista inteira no arquivo .tex, gostaria de chamar diretamente meu arquivonames.csv. Eu usei o código modificado

\documentclass{article}
\usepackage{tikz}
\usepackage{pgf}
\usepackage{array}

\def\names{{\input{names.csv}}}

\begin{document}

\pgfmathparse{\names[4]}\pgfmathresult

\end{document}

que aparentemente entra num loop infinito. Entendi que \input{}funciona da mesma forma que copiar e colar, mas não parece o caso. Claro que posso trabalhar na planilha e depois copiar e colar o conteúdo do arquivo nomes.csv, mas gostaria de entender o que acontece. Alguma pista?

Edição PS: A solução sugerida é suficiente para o meu caso. Mas ainda assim eu gostaria de poder definir macros com \input'. It seems that\input{}' dentro de uma macro que não seja expandida imediatamente. Quer dizer, se eu tiver algum código em file.tex', that I want to plugin in a new macro,\def\mymacro{\input{file}}' irá salvar \mymacro' as '\input{file}' and will only look what's inside the file when I call the macro in the document. That's why in the previous example\names' não é entendido como um array. Do mesmo jeito

\begin{filecontent*}{newfile.tex}
\input{file}
\end{filecontent*}

salvará o código \input{file}' innewfile.tex', mas não o conteúdo em `file.tex'. Alguém tem alguma ideia de como forçar a expansão da entrada?

Responder1

Em vez de importar o arquivo CSV inteiro, você pode lê-lo em linhas. Existem alguns pacotes para isso, aqui eu uso o csvsimple. O arquivo names.csvé criado pelo filecontentsambiente apenas para ter tudo em um arquivo neste exemplo.

\documentclass{article}
\usepackage{filecontents}
%% Create file
\begin{filecontents*}{names.csv}
Name1, Surname1, Affiliation1
Name2, S. Urname2, A f filiation2
Name3, Surname3, Affiliation3
Name4, Surname4, Affiliation4
Name5, Surname5, Affiliation5
\end{filecontents*}
\usepackage{tikz}
\usepackage{csvsimple}
\begin{document}
List of participants:
\begin{itemize}
  \csvreader[no head]{names.csv}{1=\name, 2=\surname, 3=\affiliation}{%
  \item \name\ \surname\ at \affiliation
  }
\end{itemize}

Badges:\newline
\csvreader[no head]{names.csv}{1=\name, 2=\surname, 3=\affiliation}{%
  \begin{tikzpicture}
    \draw[clip] (0,0) rectangle (6,4);
    \node at (3,2){\Large\name\ \surname};
    \node at (3,1.3){\affiliation};
    %% Logo
    \fill[color=red!40] (0.7,3.3) circle(1);
    \node[fill=green!40,opacity=0.5,rounded corners=5pt,anchor=west] at (0.8,3.5){\textsf{The Epic Event}};
    \node[anchor=west] at (0.8,3.5){\textsf{The Epic Event}};
  \end{tikzpicture}
}

\end{document}

insira a descrição da imagem aqui

Responder2

O readarraypacote está configurado para digerir os dados do arquivo em arrays.

\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{names.csv}
Name1,Surname1,Affiliation1,
Name2,Surname2,Affiliation2,
Name3,Surname3,Affiliation3
\end{filecontents*}
\usepackage{tikz}
\usepackage{pgf}
\usepackage{array}

\usepackage{readarray}
\readarraysepchar{,}
\begin{document}

\readdef{names.csv}\namedata

\readarray\namedata\names[-,\ncols]

\names[2,2] and \names[3,3]
\end{document}

insira a descrição da imagem aqui

Responder3

Você precisa definir \namespara que sua definição seja o conteúdo do arquivo. Isso significa que alguma expansão é necessária:

\documentclass{article}
\usepackage{tikz}
\usepackage{pgf}
\usepackage{array}

\begingroup
\makeatletter
\endlinechar=-1\relax
\everyeof{\noexpand}\relax
\edef\x{\endgroup\def\noexpand\names{{\@@input names.csv }}}\x

\begin{document}

\pgfmathparse{\names[4]}\pgfmathresult

\end{document}

informação relacionada