我有一系列csv
需要定期接收的文件,这些文件存在两个问题。
- 我不能保证有标题。
- 我无法确定每行有多少个数据条目(有时可能有 50 个左右,有时更多)
我可以保证的是,假设第 1、10 和 30 列包含我想要的数据。到目前为止,我一直在使用 perl 脚本来坍塌这些csv
文件中的每个行仅包含我感兴趣的元素。
有没有办法datatool
告诉它为某些列创建标题并忽略其余列?
例如,如果能做如下的事情就好了:
\DTLloaddb[noheader,headers={modelname=1,serialnumber=10,weight=30}]{itemweights}{somefile.csv}
这意味着它modelname
在第一列,serialnumber
在第 10 列并且weight
在第 30 列。
csv
这是一个我可能使用的极其简化的文件示例。
"toaster", "", "", "", "234-02015-23-948", "", "", "", "", "", "1255", "", ""
"blender", "junk", "", "", "753-20842-46-824", "", "", "junk", "", "", "1567", ""
"microwave", "", "", "stuff", "376-73178-68-487", "", "", "", "junk", "", "2434", "", "", ""
"radio", "", "stuff", "junk", "724-86499-61-446", "", "", "", "junk", "", "2343"
"tv", "", "", "", "423-90219-60-149", "", "junk", "", "", "", "3023", "", "", ""
为每一列创建标题的解决方案是完全不可行的,因为我有 50 多个列,但只有 3 或 4 列是我感兴趣的。
我希望能够写的是:
\DTLloaddb[noheader,headers={appliance=1,serialnumber=5,detailnumber=11}]{itemweights}{somefile.csv}
答案1
除非我误解了什么,否则这并不太难,尽管可能与你想象的并不完全一样。当datatool
读入文件并且你没有指定标题时,它会自动将标题Column1
...分配Column-n
给你的数据库。如果你指定了noheader
,那么你就不必担心重复的列名。你可以使用它在迭代时从数据库中有选择地选择列。在下面的例子中,我假设文件有一个标题行,但其中某些列包含重复项或空白。如果文件有时确实没有标题,那么示例也需要修改以处理这种情况。
\documentclass{article}
\begin{filecontents}{\jobname.csv}
1,,,Duplicate,5,Duplicate,7,8,9,10
Cell-1-2,Cell-2-2,Cell-3-2,Cell-4-2,Cell-5-2,Cell-6-2,Cell-7-2,Cell-8-2,Cell-9-2,Cell-10-2
Cell-1-3,Cell-2-3,Cell-3-3,Cell-4-3,Cell-5-3,Cell-6-3,Cell-7-3,Cell-8-3,Cell-9-3,Cell-10-3
Cell-1-4,Cell-2-4,Cell-3-4,Cell-4-4,Cell-5-4,Cell-6-4,Cell-7-4,Cell-8-4,Cell-9-4,Cell-10-4
\end{filecontents}
\usepackage{datatool}
\DTLloaddb[noheader]{testdb}{\jobname.csv}
\begin{document}
\begin{tabular}{lll}
ONE & SIX & NINE
\DTLforeach{testdb}{\one=Column1,\six=Column6,\nine=Column9}{%
\DTLiffirstrow{\\}{%
\one & \six & \nine\\
}}
\end{tabular}
\end{document}