处理输入文件

处理输入文件

从名为 的输入文件中获取第 n 行input并将其传递给名为 的宏的最简单的技术是什么\process。请注意,我不是在询问逐字输出第 n 行,而是询问捕获该行并将其传递给宏。宏\process定义如下:

\def\process#1\endprocess{%
    % process #1
}

输入文件的第 n 行应作为参数传递#1给宏\process

答案1

\makeatletter
\newread\dongen@in
\newcommand{\dongenprocess}[2]{% #1=file name, #2=line to read
  \begingroup\endlinechar=\m@ne
  \openin\dongen@in=#1\relax
  \count@=\z@
  \loop\ifnum\count@<#2\relax
    \ifeof\dongen@in
      \ERROR
    \else
      \read\dongen@in to \@tempa
    \fi
    \advance\count@\@ne
  \repeat
  \ifx\@tempa\@empty\ERROR\fi
  \closein\dongen@in
  \expandafter\endgroup
  \expandafter\process\@tempa\endprocess
}
\makeatother

如果您尝试越过文件末尾,您将收到一些错误;当然您可以\ERROR根据需要定义,例如提供后备。我假设行不为空。第二个\ERROR对应于 TeX 在文件末尾隐式假设的空行。

基本上,我会循环读取一行,直到达到所需的行。然后将\@tempa(expanded) 传递给\process

称之为

\dongenprocess{dongen.dat}{2}

读第二行。

这是一个可能的 LaTeX3 实现:

\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\dongenprocess}{mm}
  {
   \group_begin: \tex_endlinechar:D \c_minus_one
   \ior_open:Nn \l_dongen_read_s { #1 }
   \prg_replicate:nn {#2}
     {
      \ior_if_eof:NTF \l_dongen_read_s
       { \dongen_error: }
       { \ior_to:NN \l_dongen_read_s \l_dongen_read_tl }
     }
   \ior_close:N \l_dongen_read_s
   \tl_if_empty:NT \l_dongen_read_tl { \dongen_error: }
   \exp_args:NNo \group_end: \dongen_process:n { \l_dongen_read_tl }
  }

\ior_new:N \l_dongen_read_s
\tl_new:N \l_dongen_read_tl
\cs_new:Npn \dongen_process:n #1 { \process#1\endprocess }
\cs_new:Npn \dongen_error: { \tl_set:Nn \l_dongen_read_tl { INEXISTENT~LINE } }
\ExplSyntaxOff

编辑:另一个版本\dongenprocess修剪了从文件读取的输入周围的空格

\NewDocumentCommand{\dongenprocess}{mm}
  {
   \group_begin:
   \ior_open:Nn \l_dongen_read_s { #1 }
   \prg_replicate:nn {#2}
     { 
      \ior_if_eof:NTF \l_dongen_read_s 
       { \dongen_error: }
       { \ior_to:NN \l_dongen_read_s \l_dongen_read_tl }
     }
   \ior_close:N \l_dongen_read_s
   \tl_trim_spaces:N \l_dongen_read_tl
   \tl_if_in:NnT \l_dongen_read_tl { \par } { \dongen_error: }
   \exp_args:NNo \group_end: \dongen_process:n { \l_dongen_read_tl }
  }

相关内容