我需要跳过 csv 文件的第一行,该文件是由某种神奇的测量仪器自动生成的。它包含自己的文件名作为第一行。第二行包含列名(没问题),然后是数据:
C:\someFolder\measure\....\measurement.csv
"F_1k", ....
134.56, ....
我找到了逐行读取整个文件然后将除第一行之外的每一行写入临时文件的方法,但这似乎很残酷。 TH. 的回答文件输入和输出可以进行修改来做到这一点。
据我所知,pgfplots 和 datatool 不能跳过 csv 文件的行。
手动删除第一行不是一个选择,我有几百个这样的怪物。我还尽量避免使用外部程序,因为生成的代码将在不同的平台上使用。
答案1
下面的代码为 添加了键\DTLloaddb
,我将其命名为omitlines
(请提出一个更好的名称):它是一个整数,告诉我们从文件开头省略多少行。\loop...\repeat
在数据工具真正开始解析文件之前(但在打开该文件之后),删除行是通过构造完成的。
filecontents 包不是解决方案的一部分,但有助于从 TeX 文件生成外部文件(并具有自包含的 MWE)。
\documentclass{article}
\usepackage{datatool}
% The idea is to add a key to \DTLloaddb which gives
% the number of lines that should be skipped. Then
% use etoolbox to patch the internal command \\@dtlloaddb
% which does the file loading, and add a loop at the right
% place to discard some lines.
\usepackage{etoolbox}
\makeatletter
\newcount{\dtl@omitlines}
\define@key{loaddb}{omitlines}{\dtl@omitlines=#1\relax}
\expandafter\patchcmd\expandafter{\csname\string\@dtlloaddb\endcsname}
{\DTLnewdb}
{%
\loop
\ifnum \dtl@omitlines > \z@
\advance\dtl@omitlines by \m@ne
\read\@dtl@read to \@dtl@line
\repeat
\DTLnewdb
}
{\PackageInfo{datahack}{Sucess!}}
{\PackageError{datahack}{Failure!}{}}
\makeatother
% Produce the csv file.
\usepackage{filecontents}
\begin{filecontents*}{\jobname.csv}
JUNK!
More junk!
He,ade,rs
1,2,3
4,5,6
\end{filecontents*}
\begin{document}
% Load the db.
\DTLloaddb[omitlines=2]{mydata}{\jobname.csv}
% Display it.
\DTLdisplaydb{mydata}
\end{document}
答案2
根据第 4.2.2 条pgf图手动可以将 » skip first
« 选项添加到绘图命令中。
\addplot file[skip first] {datafile.dat};