我正在尝试从 csv 文件中读取两个变量。
function,value
1. pos,some text
2. pos,some other text
这在之前运行,我想要中\begin{document}
的值和中的值。
1. pos
\firstvar
2. pos
\secondvar
编辑:value
我指的是列value
,而不是字符串1. pos
本身。
\usepackage{csvsimple}
\newcommand{\firstvar}{tmpvalone}
\newcommand{\secondvar}{tmpvaltwo}
\csvreader[head to column names]{file.csv}{}%
{
\ifstrequal{\function}{1. pos}
{\renewcommand{\firstvar}{\value}}
{
\ifstrequal{\function}{2. pos}
{\renewcommand{\secondvar}{\value}}
{}
}
}
目前存在两个问题:
\ifstrequal
不起作用。我知道这与命令的扩展有关,但我无法让它工作,即使使用\expandafter\ifstrequal\expandafter
。- 即使比较有效, 也会
\renewcommand
为空。我通过使用\ifnumequal{\thecsvrow}{x}
而不是 来测试了这一点\ifstrequal
。
我感觉我已经很接近了,但是我真的不明白自己在做什么。
答案1
以下代码有效:
\documentclass{article}
\usepackage{csvsimple}
\begin{filecontents*}[overwrite]{630556.csv}
function,value
1. pos,some text
2. pos,some other text
\end{filecontents*}
\begin{document}
\newcommand{\firstvar}{tmpvalone}
\newcommand{\secondvar}{tmpvaltwo}
\csvreader[head to column names]{630556.csv}{}{
\ifcsvstrequal{\function}{1. pos}{ \edef\firstvar{\value} } { }
\ifcsvstrequal{\function}{2. pos}{ \edef\secondvar{\value} }{ }
}
\firstvar \quad \secondvar
\end{document}
答案2
在这里,我使用readarray
软件包中的工具作为替代方案。已编辑答案。
\begin{filecontents*}{file.csv}
function,value
1. pos,some text
2. pos,some other text
\end{filecontents*}
\documentclass{article}
\usepackage{readarray,forloop}
\newcounter{loopindex}
\readarraysepchar{,}
\readdef{file.csv}\filedef
\readarray*\filedef\var[-,2]
\def\onepos{1. pos}
\def\twopos{2. pos}
\forloop{loopindex}{2}{\value{loopindex}<\numexpr\varROWS+1}{
\arraytomacro\var[\theloopindex,1]\tmp
\ifx\tmp\onepos\xdef\firstvar{\var[\theloopindex,2]}\fi
\ifx\tmp\twopos\xdef\secondvar{\var[\theloopindex,2]}\fi
}
\begin{document}
``\firstvar'' and ``\secondvar''
\end{document}
此外,二维数组\var
包含文件的所有位,\var[3,2]
包含some other text
,而\var[1,1]
包含function
,等等。