DTLforeach*-“密钥选项中无法识别的密钥”

DTLforeach*-“密钥选项中无法识别的密钥”

我对 LaTeX 领域还很陌生,所以...,事实上,我不确定 DTLtool 是否最适合我的目的。我想在用于文档中所有表格的表格环境中使用 .csv 中的数据。我希望整个内容尽可能通用,因为文档(数据用户手册)需要不时重新编译(每当需要记录新的调查数据发布时,可能会有不同的计数、新文件等)。一般来说,变化不会很大,但(例如)会更改来自该 .csv 的(字符串和数字)值。我想尽量减少错误(例如手动复制/粘贴)。因此,我假设,我不知道当前 .csv 中包含的任何数据(但我可以打开它。)。我只知道,它有两列,需要将每个文件(sourceSUFfile)的值(sourcecount)放入提到的表中。

翻译成我猜测的代码可能是——并且早在\DTLforeach*失败时(“密钥选项中无法识别的密钥”):

% set document class
\documentclass{article}

% load packages
\usepackage{caption} %% for captions outside of floats
\usepackage{datatool}
\usepackage{filecontents}
\usepackage{pgffor} % for use of \foreach

% create database
\begin{filecontents*}{sourceSUFfiles.csv}
    sourceSUFfile,sourcecount
    SC1CohortProfile,2
    SC1pParent,818
    SC1xDirectMeasures,262
    SC1xTargetCompetencies,5
    SC2CohortProfile,2
    SC2pParent,784
    SC2pParentCORONA,6
    SC2pTarget,326
    SC2xTargetCompetencies,110
\end{filecontents*}

% load database and create macros
\DTLloaddb{dbsource}{sourceSUFfiles.csv}
\newcommand{\rows}{\DTLrowcount}
\DTLforeach*{dbsource}{ %
    \newcommand{\currentrow}{\dtlrownum}
    \newcommand{\file\currentrow}{sourceSUFfile}
    \newcommand{\sourcecount\currentrow}{sourcecount}       
}

% start document (content)
\begin{document}
    
    % put data into table with predefined format (specialTable)
    \begingroup
    %\renewcommand{\arraystretch}{1.2}
    \begin{table} 
    %   \captionabove{data source files variables are selected from \label{tab:Sourcefiles}}
        \begin{tabular}{lr} %
            %\nth{Filename} & \nth{Number of variables selected}    \\
            %\addlinespace
            \foreach \n in {2-\rows} { % iterate through values 2 upto the number of rows (*not* counting the first [header row])
                \file\n & \sourcecount\n % fill in filename of sourcefile and count of variables of that file
            }               
        \end{tabular}
    \end{table}
    \endgroup
    
\end{document}

总结一下:我想将此 .csv 打印到我的文档中,而无需(像在黑框中一样)提前知道行数甚至文件名和计数。实现此目的的最佳方法是什么?

这些键有什么问题(代码中甚至没有提到)?非常感谢任何有关这方面的提示!

答案1

这个简单的模板适用于两列表格。您可以将标题存储在命令中,并在需要时插入。

请注意,数据库的标题不是行的一部分。如果您只想显示行,请删除该行\bfseries Source SUF file & \bfseries Source count

\begin{filecontents*}[overwrite]如果数据会改变则使用。\usepackage{filecontents}不再需要。

b

% set document class
\documentclass{article}

% load packages
\usepackage{caption} %% for captions outside of floats
\usepackage{datatool}

% create database
\begin{filecontents*}[overwrite]{sourceSUFfiles.csv}
    sourceSUFfile,sourcecount
    SC1CohortProfile,2
    SC1pParent,818
    SC1xDirectMeasures,262
    SC1xTargetCompetencies,5
    SC2CohortProfile,2
    SC2pParent,784
    SC2pParentCORONA,6
    SC2pTarget,326
    SC2xTargetCompetencies,110
\end{filecontents*}

\newcommand{\LeftHeader}{sourceSUFfile}% store the headers of the db
\newcommand{\RightHeader}{sourcecount}

\begin{document}
    
    \DTLloaddb{dbsource}{sourceSUFfiles.csv}
        
%   \DTLdisplaydb{dbsource} %^ to check the database loaded OK

    
\begin{table}[htbp]
    \caption{data source files variables are selected from \label{tab:Sourcefiles}}
    \centering
    \begin{tabular}{lc}
        \bfseries Source SUF file & \bfseries Source count
        \DTLforeach{dbsource}{%
            \LeftCol=\LeftHeader,\RigthCol=\RightHeader}{%
            \\%  new row
            \LeftCol & \RigthCol }
    \end{tabular}
\end{table} 
    
\end{document}

相关内容