![pgfplotstablesave および CSV ファイル](https://rvso.com/image/405339/pgfplotstablesave%20%E3%81%8A%E3%82%88%E3%81%B3%20CSV%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB.png)
このファイルは CSV ファイルを書き出します:
\documentclass{article}
\usepackage{pgfplots,pgfplotstable}
\pgfplotstableread[col sep=comma]{
1,2
3,4
5,6
7,8
9,10
}\data
\begin{document}
\pgfplotstablesave[col sep=comma]{\data}{data.csv}
\end{document}
CSV ファイルは次のようになります。
0,1,
1,2,
3,4,
5,6,
7,8,
9,10,
各行の末尾のカンマを避ける方法はありますか?
答え1
はい、可能ですが、私が調べたところによると、内部マクロを再定義する必要があるようです。私がしたのは、
\xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
によって\pgfplotstablesave@impl
\ifnum\pgfplotstablecol<\pgfplotstablecols
\xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
\else
\xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka}%
\fi
ここに\pgfplotstablecol
現在の列と\pgfplotstablecols
列の数があります。 の場合にのみコンマが追加されます\pgfplotstablecol<\pgfplotstablecols
。これは最初の実装です。
\documentclass{article}
\usepackage{pgfplots,pgfplotstable}
\makeatletter
\def\pgfplotstablesave@impl[#1]#2#3{%
\pgfplotstabletypeset[%
reset styles,%
disable rowcol styles,%
begin table={},%
end table={},%
typeset cell/.code={%
\begingroup
\t@pgfplots@toka={##1}%
\ifcase\pgfplotstableread@OUTCOLSEP@CASE\relax
% col sep=SPACE:
\t@pgfplots@tokb=\expandafter{\pgfplotstableread@tab}%
\pgfplots@ifempty{##1}{%
\t@pgfplots@toka={{}}%
}{}%
\xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
\or
% col sep=comma:
\t@pgfplots@tokb={,}%
\ifnum\pgfplotstablecol<\pgfplotstablecols
\xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
\else
\xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka}%
\fi
\or
% col sep=semicolon:
\t@pgfplots@tokb={;}%
\xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
\or
% col sep=colon:
\t@pgfplots@tokb={:}%
\xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
\or
% col sep=braces:
\xdef\pgfplots@glob@TMPc{{\the\t@pgfplots@toka}}%
\or
% col sep=tab:
\xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka\pgfplotstableread@tab}%
\or
% col sep=&:
\xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka&}%
\fi
\endgroup
\pgfkeyslet{/pgfplots/table/@cell content}\pgfplots@glob@TMPc%
},%
before row=,%
after row=,%
skip coltypes,%
typeset=false,%
string type,%
TeX comment=,%
columns=,%
font=,%
/pgfplots/table/col sep/.is choice,%
/pgfplots/table/col sep/space/.code = {\def\pgfplotstableread@OUTCOLSEP@CASE{0}},%
/pgfplots/table/col sep/comma/.code = {\def\pgfplotstableread@OUTCOLSEP@CASE{1}},%
/pgfplots/table/col sep/semicolon/.code = {\def\pgfplotstableread@OUTCOLSEP@CASE{2}},%
/pgfplots/table/col sep/colon/.code = {\def\pgfplotstableread@OUTCOLSEP@CASE{3}},%
/pgfplots/table/col sep/braces/.code = {\def\pgfplotstableread@OUTCOLSEP@CASE{4}},%
/pgfplots/table/col sep/tab/.code = {\def\pgfplotstableread@OUTCOLSEP@CASE{5}},%
/pgfplots/table/col sep/&/.code = {\def\pgfplotstableread@OUTCOLSEP@CASE{6}},%
/pgfplots/table/col sep/ampersand/.code = {\def\pgfplotstableread@OUTCOLSEP@CASE{6}},%
/pgfplots/table/col sep=space,%
/pgfplots/table/in col sep/.is choice,%
/pgfplots/table/in col sep/space/.code = {\def\pgfplotstableread@COLSEP@CASE{0}},%
/pgfplots/table/in col sep/comma/.code = {\def\pgfplotstableread@COLSEP@CASE{1}},%
/pgfplots/table/in col sep/semicolon/.code = {\def\pgfplotstableread@COLSEP@CASE{2}},%
/pgfplots/table/in col sep/colon/.code = {\def\pgfplotstableread@COLSEP@CASE{3}},%
/pgfplots/table/in col sep/braces/.code = {\def\pgfplotstableread@COLSEP@CASE{4}},%
/pgfplots/table/in col sep/tab/.code = {\def\pgfplotstableread@COLSEP@CASE{5}},%
/pgfplots/table/in col sep/&/.code = {\def\pgfplotstableread@COLSEP@CASE{6}},%
/pgfplots/table/in col sep/ampersand/.code = {\def\pgfplotstableread@COLSEP@CASE{6}},%
/pgfplots/table/in col sep=space,%
% WARNING: you NEED a '%' before '#1':
#1,%
/pgfplots/table/include outfiles=false,
/pgfplots/table/outfile={#3}%
]{#2}%
}%
\makeatother
\pgfplotstableread[col sep=comma]{
1,2
3,4
5,6
7,8
9,10
}\data
\begin{document}
\pgfplotstablesave[col sep=comma,after row={}]{\data}{data.csv}
Hello
\end{document}
結果的に
0,1
1,2
3,4
5,6
7,8
9,10
今のところ、私はコンマの場合のみこれを行いましたが、すべての列区切りに適用するのは簡単です。しかし、組み込みのソリューションがない場合は、機能リクエストを行う必要があると思います。古いコードを壊さないように、ユーザーが指定した場合にのみこの変更をオンにするキーを追加する方が安全かもしれません (これがデフォルトであるべきだと感じていますが)。