在白色桌子上书写(叠加书写)

在白色桌子上书写(叠加书写)

我试图将 csv 文件的行数放入 latex 文档中,而实际上并不将表格放入最后一个文档中。

我尝试过标签包,并将表格放在另一个 latex 文档中,标签之间使用“\thenumberofrows”。但是,当我在实际文档中使用“\ExecuteMetaData[file.tex]{tag}”时,它不起作用,只给出 0,因为表格不在实际文档中。

因此,我需要在实际文档中有一个“不可见”的表格,以便我可以从中获取行数。我尝试将表格写成白色,但这会占用文档中的空间。如果我可以将文本放在这个白色表格上,那么就不会有问题了。

如果有人能帮助我在乳胶上放一张“隐形桌子”,我将非常感激!

瓦尔

答案1

您可以通过打开并读取文件来计算文件中的行数:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\countlines}{om}
 {
  \int_zero:N \l_tmpa_int
  \ior_open:Nn \valerie_countlines_stream { #2 }
  \ior_str_map_inline:Nn \valerie_countlines_stream
   {
    \int_incr:N \l_tmpa_int
   }
  \ior_close:N \valerie_countlines_stream
  \IfNoValueTF{#1}
   {
    \int_eval:n { \l_tmpa_int }
   }
   {
    \tl_set:Nx #1 { \int_eval:n { \l_tmpa_int } }
   }
 }
\ior_new:N \valerie_countlines_stream
\ExplSyntaxOff

\begin{document}

This very document has \countlines{\jobname.tex} lines.

\countlines[\thisfile]{\jobname.tex}

The number can be stored in \verb|\thisfile|: \thisfile

\end{document}

在此处输入图片描述

datatool

\begin{filecontents*}{\jobname.csv}
a,b,c,d
1,2,3,4
x,y,z,t
\end{filecontents*}

\documentclass{article}

\usepackage{datatool}

\DTLloaddb{test}{\jobname.csv}

\begin{document}

\DTLrowcount{test}

\end{document}

这将打印 2,因为第一行默认被视为标题。如果你使用

\DTLloaddb[noheader]{test}{\jobname.csv}

你会得到 3。

您还可以

\edef\thisfile{\DTLrowcount{test}}

并且宏\thisfile将扩展为相同的数字。

答案2

你可以用 轻松计算行数csvsimple。你只需要使用一个\csvreader对行内容不执行任何操作的命令:

\csvreader{<file>}{}{}

如果要在计数中包含文件的第一行,您可以添加no head\csvreader命令中。

\csvreader[no head]{<file>}{}{}

处理的行数存储在计数器中csvrow,可以使用 打印\thecsvrow。这是一个完整的例子。

\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.csv}
ColA,ColB,ColC
A1,B1,C1
A2,B2,C2
A3,B3,C3
A4,B4,C4
A5,B5,C5
A6,B6,C6
A7,B7,C7
\end{filecontents*}
\begin{filecontents*}{\jobname B.csv}
ColA,ColB,ColC
A1,B1,C1
A2,B2,C2
A3,B3,C3
\end{filecontents*}
\usepackage{csvsimple}

\begin{document}
\csvautotabular{\jobname.csv}

\csvreader{\jobname.csv}{}{}

This CSV file has \thecsvrow\ rows.
\bigskip

\csvautotabular{\jobname B.csv}

\csvreader[no head]{\jobname B.csv}{}{}

This CSV file has \thecsvrow\ rows (header included).

\end{document}

代码输出

答案3

readarray包可以导入和计数文件中的数据。在这里我将其读取为记录数组(忽略任何列)。如果文件以空行结尾,行数有时会比您希望的要大 1。所以我做了一个快速\if测试来筛选出这种情况。

该包还可以读取二维和三维数组数据,并将其存储在索引结构中。

\begin{filecontents*}{\jobname.csv}
a,b,c,d
1,2,3,4
x,y,z,t
\end{filecontents*}
\documentclass{article}
\usepackage{readarray}
\begin{document}
\readrecordarray{\jobname.csv}\mydata
Records in file: 
\if\relax\mydata[\mydataROWS]\relax\the\numexpr\mydataROWS-1\else\mydataROWS\fi
\end{document}

在此处输入图片描述

为了更全面地说明其数组读取功能:

\begin{filecontents*}{\jobname.csv}
a,b,cCc,d
1,2,3,4
x,y,z3po ,t
\end{filecontents*}
\documentclass{article}
\usepackage{readarray}
\begin{document}
\obeylines
\readarraysepchar{,}
\readdef{\jobname.csv}\mydef
\readarray*\mydef\mydata[-,\ncols]
Rows, columns read: \mydataROWS, \mydataCOLS\par
making a total of \mydataCELLS{} cells.\par
cell[3,2] is \mydata[3,2]\par
Here is the arraydump of mydata: \arraydump\mydata
Bounds checking\par
no error checking on cell [5,1]: \mydata[5,1]\par
\checkbounds
checkbounds error checking on cell [5,1]: \mydata[5,1]\par
\hypercheckbounds
hyper-checkbounds error checking on cell [5,1]: \mydata[5,1]\par
Log file extract:
\begin{verbatim}
readarray: bounds checking ON
readarray Warning: \mydata[5,1]  out of bounds.
readarray: bounds hyperchecking ON
readarray Warning: \mydata[5,1]  out of bounds:
ROW=5 exceeds bounds(=3) for mydata.
\end{verbatim}
\end{document}

在此处输入图片描述

相关内容