我正在尝试从外部文件读取一些数据并根据给定行的内容执行特定操作。
下面是我尝试使用 测试读取行\ifx
- 它不起作用。我还尝试使用包\ifthenelse
中的ifthen
和 中的一些通用测试etoolbox
。由于我所有的尝试都失败了,我现在有两个问题:
- 如何进行测试来查看从外部文件读取的数据是否与指定的字符串匹配?
- 我应该如何调试才能找出测试失败的原因?根据下面 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
你的宏中有两个小故障。
- 你
\readline
可以使用\read
- 您没有禁用
\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