测试从外部文件读取的行

测试从外部文件读取的行

我正在尝试从外部文件读取一些数据并根据给定行的内容执行特定操作。

下面是我尝试使用 测试读取行\ifx- 它不起作用。我还尝试使用包\ifthenelse中的ifthen和 中的一些通用测试etoolbox。由于我所有的尝试都失败了,我现在有两个问题:

  1. 如何进行测试来查看从外部文件读取的数据是否与指定的字符串匹配?
  2. 我应该如何调试才能找出测试失败的原因?根据下面 MWE 的排版输出,Line with bar从外部文件读取的内容似乎匹配\linetomatch

正如\usepackage序言中的陈述所示,我希望代码能够同时与 LuaLaTeX 和 pdfLaTeX 一起使用(使用io.open块打开文件\directlua可以工作,并且我可以在 LuaLaTeX 中使用 Lua 进行测试。但是,我更喜欢在 pdfLaTeX 中也能工作的版本)。

\documentclass{article}
\usepackage{fontspec}
%\usepackage[T1]{fontenc}
%\usepackage[utf8]{inputenc}

\usepackage{filecontents}
\begin{filecontents*}{datafile.txt}
Line with foo
Line with bar
Line with baz
\end{filecontents*}

\makeatletter
\newread\myread
\def\loaddata#1{%
    \edef\linetomatch{Line with bar}%
    \openin\myread=#1
    \@whilesw\unless\ifeof\myread\fi{%
        \readline\myread to \dataline%
        \noindent"\linetomatch"
        \ifx\dataline\linetomatch\relax
            equals 
        \else
            does not equal
        \fi
        "\dataline"\par
    }%
    \closein\myread
}%
\makeatother

\begin{document}

\loaddata{datafile.txt}

\end{document}

答案1

你的宏中有两个小故障。

  1. \readline可以使用\read
  2. 您没有禁用\endlinechar

该指令将类别代码 12 个标记(空格为 10 个)\readline放入一个字符串中。而您的宏在其替换文本中却有类别代码 11 个标记。因此,一般来说,最好使用。\dataline\linetomatch\read

TeX 总是将\endlinechar字节附加到输入行的末尾(通常是字节 13),除非该值超出范围(-1 适合禁用它)。

\endlinechar不太严重的是,在所有输入文件的末尾隐式添加空行(其中可能只有)。

\makeatletter
\newread\myread
\def\loaddata#1{%
    \def\linetomatch{Line with bar}% \edef is not required
    \openin\myread=#1
    \begingroup\endlinechar=-1
    \@whilesw\unless\ifeof\myread\fi{%
        \read\myread to \dataline
        \noindent"\linetomatch"
        \ifx\dataline\linetomatch\relax
            equals
        \else
            does not equal
        \fi
        "\dataline"\par
    }%
    \endgroup
    \closein\myread
}%
\makeatother

在此处输入图片描述

相关内容