考虑一下这个MWE:
\documentclass[a4paper,12pt]{article}
\usepackage{pgfplots,filecontents}
\begin{filecontents*}{data.csv}
"Amplitude","notes: data set 1",
X,Y,
1,1,
2,2,
3,3,
4,4,
"CH1","notes: data set 1",
\end{filecontents*}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot gnuplot [raw gnuplot, mark=none, black]{
set datafile separator comma;
plot "data.csv" using 1:2 every ::3::6 with lines;
};
\end{axis}
\end{tikzpicture}
\end{document}
我曾经用它gnuplot
来绘制.csv
文件中的数据。关于我的文件的格式.csv
,我知道数据总是从第 3 行开始,但我不知道数据会有多长。当处理 1 组数据(如本例中所示)时,只需计算出有 4 行并手动输入every ::3::6 with lines
(即从第 3 行到第 6 行)就不太难了。
我的问题是我的实际.csv
文件要复杂得多 - 它包含多个数据块,并且它们的长度都不同(如果不手动检查,我不知道确切的长度,大约 2000 多个点)。我的 MWE 的这个扩展说明了这个问题:
\documentclass[a4paper,12pt]{article}
\usepackage{pgfplots,filecontents}
\begin{filecontents*}{data.csv}
"Amplitude","notes: data set 1",
X,Y,
1,1,
2,2,
3,3,
4,4,
"Amplitude","notes: data set 2",
X,Y,
1,7,
2,6,
3,5,
4,4,
5,3,
6,2,
7,1,
"CH1","notes: data set 1",
"CH1","notes: data set 2",
\end{filecontents*}
\begin{document}
\begin{tikzpicture}
\begin{axis} [width=0.5\textwidth,height=7cm,
]
\addplot gnuplot [raw gnuplot, mark=none, black]{
set datafile separator comma;
plot "data.csv" using 1:2 every ::3::6 with lines;
};
\end{axis}
\end{tikzpicture}
\end{document}
有没有办法自动.csv
处理这个文件?理想情况下,我希望这样 TeX 可以计算出存储了多少个数据块,.csv
然后我可以选择要绘制哪些数据块(一些在单独的图上,一些在一起)。
仅供参考,这样做的目的是为了自动生成报告。我选择数据文件,选择要绘制的块,然后点击运行,文档就会自动生成。
答案1
这不是一个完整的答案,因为我不知道如何使用pgfplots
和gnuplot
。但是,这个答案显示了如何使用readarray
(及其底层listofitems
)提取输入文件的一部分。
您现在只需要弄清楚如何将提取的部分传递给gnuplot
。
\documentclass[a4paper,12pt]{article}
\usepackage{pgfplots,filecontents,readarray}
\begin{filecontents*}{mydata.csv}
"Amplitude","notes: data set 1",
X,Y,
1,1,
2,2,
3,3,
4,4,
"Amplitude","notes: data set 2",
X,Y,
1,7,
2,6,
3,5,
4,4,
5,3,
6,2,
7,1,
"CH1","notes: data set 1",
"CH1","notes: data set 2",
\end{filecontents*}
\begin{document}
\readarraysepchar{\\}
\readdef{mydata.csv}\mydata
\ignoreemptyitems
\setsepchar{%
"Amplitude","notes: data set 2",% START OF DATA SET
/%
"CH1","notes: data set 1",% END OF DATA SET
/%
\\% SAME UNIQUE TOKEN STRING SET IN \readarraysepchar
}
\readlist\myarray{\mydata}
\noindent\foreachitem\x\in\myarray[2,1]{\xcnt: \x\\}
\end{document}