为了以某种方式使用 pstricks,我想在多循环内逐行访问数据文件。例如,假设我的文件名为 Datafile.dat。它包含 20 个点的 (x,y) 坐标。我想要类似
\multido{\iA=0+1}{20}{%
\psdot(Datafile.dat(\iA,1),Datafile.dat(\iA,2))
}
我知道有函数可以做到这一点,但我的重点是能够逐个元素地访问数据文件。
答案1
这可能会对你有用。
假设 dataA.txt 文件包含以下以空格分隔的数据:
.15 12 13 14
.20 22 23 24
.25 45.6 33 Ending
然后此代码可以使用定义的命令读取文件\readdef
(如示例中的 dataA)或者您可以将其剪切并粘贴到文件中(如示例中的 dataB)
\documentclass{article}
\usepackage{stringstrings}
%
\newcounter{index}
\newcounter{row}
\newcounter{col}
%
\newcommand\readArray[3]{%
\setcounter{index}{0}%
\setcounter{row}{1}%
\setcounter{col}{0}%
\getargs{#1}%
\whiledo{\value{index} < \narg}{%
\addtocounter{index}{1}%
% \arabic{index}:~%
\addtocounter{col}{1}%
\ifthenelse{\value{col} > #3}%
{\addtocounter{row}{1}%
\addtocounter{col}{-#3}}%
{}%
% \arabic{row}-\arabic{col}\\%
\expandafter\edef\csname#2X\roman{row}X\roman{col}\endcsname%
{\expandafter\csname arg\roman{index}\endcsname}%
}%
}
%
\newcommand\Arrayij[3]{%
\setcounter{row}{#2}
\setcounter{col}{#3}
\csname#1X\roman{row}X\roman{col}\endcsname
}
%
\newcommand\readdef[2]{%
\catcode\endlinechar=10\relax%
\def#2{}%
\newread\file%
\openin\file=#1%
\loop\unless\ifeof\file%
\read\file to\fileline % Reads a line of the file into \fileline%
% Do something with \fileline%
\edef#2{#2\fileline}%
\repeat%
\closein\file%
\catcode\endlinechar=5\relax%
}
%
\begin{document}
%
\readdef{dataA.txt}{\dataA}
% The \readdef produces the equivalent result to
% \edef\dataA{
% .15 12 13 14
% .20 22 23 24
% .25 45.6 33 Ending
% }
%
\def\dataB{%
B.15 B12 B13 B14
B.20 B22 B23 B24
B.25 B32 B33 BEnding
}
%
% This says to read the variable \dataA, stick it into an "array"
% called arA with a 4-column width
\readArray{\dataA}{arA}{4}
\readArray{\dataB}{arB}{4}
\noindent
The data in the 3,2 position of the dataA file is \Arrayij{arA}{3}{2}\\
The data in the 3,4 position of dataB is \Arrayij{arB}{3}{4}
\end{document}
该\readArray
命令获取空格分隔的数据并将其粘贴到数组中,然后您可以通过调用回调单个数组元素\Arrayij
。它目前针对 2-D (x,y) 数据输入进行定义,但可以适用于 3-D 数据输入。
(顺便说一句,使用的 stringstrings 例程是\getargs
。如果大数据的速度慢是一个问题,那么该例程的更快版本已经由各种 bright sx 用户在解析包含变音符号(宏?)的字符串。
注意:经过编辑,\readdef
可以多次使用而不会覆盖自身。