当标头不可用时使用 datatool 访问数据

当标头不可用时使用 datatool 访问数据

我有一系列csv需要定期接收的文件,这些文件存在两个问题。

  1. 我不能保证有标题。
  2. 我无法确定每行有多少个数据条目(有时可能有 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}

代码输出

相关内容