我是 Latex 新手,遇到了一些问题。我已成功读取 .csv 文件:
,w5,w6,w7,w8,w9,w10,w11,w12,w13,w14,w15,w16,w17,w18,w19,w20,w21,w22,w23,w24
,25,23,13,14,15,39,36,4,37,11,26,13,34,39,40,22,33,32,9,5
,56,31,45,31,38,41,59,26,,44,52,33,,42,,28,51,41,28,36
并使用如何使用 datatool 包读取 CSV 文件以便在表中使用?得到这个输出:
但现在我必须像这样格式化表格:
我不知道该怎么做,因为首先我不知道如何设置表格可以放入纸张的边距(我使用了几何包来使页面横向显示,但这还不够)。
然后每个单元格包含出发时间(小时和分钟),均为两位数字,但有时我没有两位数字,只有一位数字,所以我必须切换,例如从12 4 -> 12 04
。
最后,每个数据字段表示特定小时内的出发时间,例如,w5 列中的数字 25 表示出发时间为 5:25,我不知道如何这样格式化。我试过这样做,但我认为这不是正确的方法:
\ifthenelse{\equal{\insertbyname{w5}}{}}{\insertbyname{w5}&}{{\bf 05} \insertbyname{w5} &}
如果有人能帮助我我会非常高兴。
答案1
由于您的表格非常宽,唯一真正的选择是通过 缩放它以适合页面的整个宽度\resizebox{\linewidth}{!}{\DTLdisplaydb{myDB}}
。我不会包含完整的图像,因为它很难读懂,但这是表格的左侧和右侧,使用 绘制框架\usepackage[showframe]{geometry}
:
...
就访问数据库而言,您需要使用键来定位特定值。因此,假设您想定位列中的行值1
,并使用列的w5
行值:2
w6
\GetValueOfColumnAtRow{\myValue}{w5}{1}
\GetValueOfColumnAtRow{\myValue}{w6}{2}
并且值存储在 中\myValue
。因此,使用下面的代码,我们可以获得:
要遍历数据库的每一行,可以使用\DTLforeach
。以下代码展示了如何处理数据的前三列以产生结果:
笔记:
- 由于这个问题更多的是关于从数据库访问数据,因此我没有解决格式化表格的具体问题。这些问题应该放在一个单独的问题中,因为它们与数据库访问并非无关。
代码:
\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{datatool}
\usepackage{graphicx}
\newcommand*{\GetValueOfColumnAtRow}[3]{%
% #1 = csname of where to store the result
% #2 = key for column
% #3 = row number
\DTLgetvalue{#1}{myDB}{#3}{\dtlcolumnindex{myDB}{#2}}%
}%
\begin{document}
\DTLloaddb{myDB}{MyData.csv}
\noindent
\resizebox{\linewidth}{!}{\DTLdisplaydb{myDB}}
\bigskip\noindent
\GetValueOfColumnAtRow{\myValue}{w5}{1}
The value of w5 in row 1 is \myValue.
\par\noindent
\GetValueOfColumnAtRow{\myValue}{w6}{2}
The value of w6 in row 2 is \myValue.
\bigskip
\begin{tabular}{l l l l l}
5 to & 6 to & 7 to \\
6am & 7am & 8am \\\hline
\DTLforeach{myDB}{%
\WFive=w5,
\WSix=w6,
\WSeven=w7%
}{%
5:\WFive &
6:\WSix &
7:\WSeven &
\\
}%
\end{tabular}
\end{document}