從 csv 檔案建立字串數組

從 csv 檔案建立字串數組

我想使用循環創建一些姓名徽章。我有一個包含名稱和從屬關係的電子表格,我將其保存在名稱.csv 檔案中,如下所示

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

我可以將 name.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{}就像複製貼上一樣,但事實似乎並非如此。當然,我可以在電子表格中工作,然後複製貼上名稱.csv 文件內容,但我想了解會發生什麼。有什麼線索嗎?

PS編輯:建議的解決方案足以滿足我的情況。但我仍然希望能夠\input'. It seems that在宏內使用 \input{}' 定義宏,但不會立即展開。我的意思是,如果我在file.tex', that I want to plugin in a new macro,\def\mymacro{\input{file}}'中有一些程式碼,將儲存\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' 不被理解為陣列。同樣的方式

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

將儲存程式碼\input{file}' innewfile.tex',但不儲存'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}

相關內容