csvsimple 和 longtable (自动标题行)

csvsimple 和 longtable (自动标题行)

帮助其他社区成员(参见使用 csvreader 读取 csv 时给出无效输出) 在 csvreading 任务中我试图解决一个问题,如下所示......

\begin{filecontents*}{test-table.csv}
Name,Value,Text
Test 1,1,A
Test 2,2,B
Test 3,3,A
Test 4,4,B
Test 5,5,A
Test 6,6,B
Test 7,7,A
Test 8,8,B
Test 9,9,A
Test 10,10,B
Test 11,11,A
Test 12,12,B
Test 13,13,A
Test 14,14,B
Test 15,15,A
Test 16,16,B
Test 17,17,A
Test 18,18,B
Test 19,19,A
Test 21,21,B
Test 22,22,B
Test 23,23,B
Test 24,24,B
Test 25,25,B
Test 26,26,B
Test 27,27,B
Test 1,1,A
Test 2,2,B
Test 3,3,A
Test 4,4,B
Test 5,5,A
Test 6,6,B
Test 7,7,A
Test 8,8,B
Test 9,9,A
Test 10,10,B
Test 11,11,A
Test 12,12,B
Test 13,13,A
Test 14,14,B
Test 15,15,A
Test 16,16,B
Test 17,17,A
Test 18,18,B
Test 19,19,A
Test 21,21,B
Test 22,22,B
Test 23,23,B
Test 24,24,B
Test 25,25,B
Test 26,26,B
Test 27,27,B
\end{filecontents*}

\documentclass{article}
\usepackage{longtable}
\usepackage{csvsimple}
\begin{document}
\csvreader[
  longtable=lll,
  head,
  table head={%
    \bfseries Name & \bfseries Value & \bfseries Text\\\hline\endhead
    \caption{Example}\endlastfoot
  },
]{test-table.csv}{
  Name=\colname,
  Value=\colvalue,
  Text=\coltext
}{%
  \colname & \colvalue & \coltext
}
\end{document}

取自从 PDF 导入多页表格作为表格

问题:为什么我必须手动包含标题,文本是 csv 输入第一行的一部分。有没有办法将第一行的值注入到 longtable 的所有标题中?

答案1

标题行被视为 中的唯一管理信息csvsimple。它用于对列进行计数,并可以通过标题名称来定位列。但它不用作数据。您给出的示例就是它应有的样子。

将标题行视为普通的数据输入,有选项no head。然后,第一行只是一条数据行,不用于确定列数或为列命名。但您可以通过使用它来做\csviffirstrow一些特殊的事情,比如将它用作longtable标题。

您的示例可以按以下方式转换。我使用\csvloop它,因为它更基础,您可能会更好地看到发生了什么:

\begin{filecontents*}{test-table.csv}
Name,Value,Text
Test 1,1,A
Test 2,2,B
Test 3,3,A
Test 4,4,B
Test 5,5,A
Test 6,6,B
Test 7,7,A
Test 8,8,B
Test 9,9,A
Test 10,10,B
Test 11,11,A
Test 12,12,B
Test 13,13,A
Test 14,14,B
Test 15,15,A
Test 16,16,B
Test 17,17,A
Test 18,18,B
Test 19,19,A
Test 21,21,B
Test 22,22,B
Test 23,23,B
Test 24,24,B
Test 25,25,B
Test 26,26,B
Test 27,27,B
Test 1,1,A
Test 2,2,B
Test 3,3,A
Test 4,4,B
Test 5,5,A
Test 6,6,B
Test 7,7,A
Test 8,8,B
Test 9,9,A
Test 10,10,B
Test 11,11,A
Test 12,12,B
Test 13,13,A
Test 14,14,B
Test 15,15,A
Test 16,16,B
Test 17,17,A
Test 18,18,B
Test 19,19,A
Test 21,21,B
Test 22,22,B
Test 23,23,B
Test 24,24,B
Test 25,25,B
Test 26,26,B
Test 27,27,B
\end{filecontents*}

\documentclass{article}
\usepackage{longtable}
\usepackage{csvsimple}
\begin{document}
\csvloop{
  file=test-table.csv,
  no head,
  column count=3,% could may removed for 10 or less columns
  before reading=\begin{longtable}{lll}\caption{Example}\endlastfoot,
  command={\csviffirstrow%
    {\bfseries\csvcoli & \bfseries\csvcolii & \bfseries\csvcoliii}
    {\csvcoli & \csvcolii & \csvcoliii}%
  },
  late after line=\\,
  late after first line=\\\hline\endhead,
  late after last line=,
  after reading=\end{longtable}
}
\end{document}

或者,可以通过添加

%...
column names={1=\colname,2=\colvalue,3=\coltext},
%...

但是,我认为,这个例子的想法是我们事先不知道列名......

相关内容