pgfplotstablesave および CSV ファイル

pgfplotstablesave および CSV ファイル

このファイルは 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

今のところ、私はコンマの場合のみこれを行いましたが、すべての列区切りに適用するのは簡単です。しかし、組み込みのソリューションがない場合は、機能リクエストを行う必要があると思います。古いコードを壊さないように、ユーザーが指定した場合にのみこの変更をオンにするキーを追加する方が安全かもしれません (これがデフォルトであるべきだと感じていますが)。

関連情報