逐项读取数据文件

逐项读取数据文件

为了以某种方式使用 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可以多次使用而不会覆盖自身。

相关内容