csv 파일에서 문자열 배열 만들기

csv 파일에서 문자열 배열 만들기

루프를 사용하여 이름 배지를 만들고 싶습니다. 다음과 같이 names.csv 파일에 저장하는 이름과 소속이 포함된 스프레드시트가 있습니다.

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

names.csv의 내용을 문자열 배열로 복사하고 루프를 사용하여 항목을 복구할 수 있습니다. 다음은 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}

이 아이디어를 사용하여 수백 개의 이름표를 반복해서 만들 수 있습니다. 하지만 .tex 파일에 전체 목록을 작성하는 대신 내 names.csv 파일을 직접 호출하고 싶습니다. 수정된 코드를 사용했습니다

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

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

\begin{document}

\pgfmathparse{\names[4]}\pgfmathresult

\end{document}

분명히 무한 루프에 들어가는 것 같습니다. 복사 붙여넣기와 같은 효과가 있다는 것을 이해했지만 \input{}그렇지 않은 것 같습니다. 물론 스프레드시트에서 작업한 다음 names.csv 파일 콘텐츠를 복사하여 붙여넣을 수 있지만 무슨 일이 일어나는지 알고 싶습니다. 어떤 단서가 있나요?

PS 편집: 제 경우에는 제안된 솔루션으로 충분합니다. 하지만 여전히 \input'. It seems that매크로 내부에 \input{}' 이 있는 매크로를 정의할 수 있으면 즉시 확장되지 않을 수 있기를 바랍니다 . 내 말은 \def\mymacro{\input{file}}'에 일부 코드가 있으면 \names'가 배열로 인식되지 않는다는 것을 file.tex', that I want to plugin in a new macro,저장한다는 뜻입니다. \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같은 방법으로

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

newfile.tex' 코드는 저장되지만 \input{file}' in`file.tex'의 내용은 저장되지 않습니다. 입력을 강제로 확장하는 방법을 아는 사람이 있나요?

답변1

전체 csv 파일을 가져오는 대신 행 단위로 읽을 수 있습니다. 이를 위한 몇 가지 패키지가 있습니다. 여기서는 csvsimple. 파일은 이 예제에서 하나의 파일에 모두 포함하기 위해 환경 names.csv에서 생성됩니다 .filecontents

\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}

여기에 이미지 설명을 입력하세요

답변2

패키지 readarray는 파일 데이터를 배열로 다이제스트하도록 설정되었습니다.

\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}

여기에 이미지 설명을 입력하세요

답변3

\names해당 정의가 파일의 내용이 되도록 정의해야 합니다 . 이는 일부 확장이 필요함을 의미합니다.

\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}

관련 정보