如何从 CSV 文件排版数字表

如何从 CSV 文件排版数字表

db.txt我有一个这样的CSV 文件( ):

30.0,   0.0,    0.0
60.0,   1.9098, 5.8779
90.0,   6.9098, 9.5106
120.0,  13.09,  9.5106
150.0,  18.09,  5.8779
180.0,  20.0,   0.0

我需要排版。我的问题与小数点的错误对齐和小数位数有关(每列必须是常数):

\renewcommand*{\dtlrealalign}{r}

\DTLloaddb[
    noheader,
    keys={x,y,theta},
    headers={
        \shortstack{$\boldsymbol{\theta_{2,i}}$},
        \shortstack{X},
        \shortstack{Y}
             }
  ]{db}{db.txt}
\begin{table}[t]
  \caption{Database file}
  \centering
  \DTLdisplaydb{db}
\end{table}

表快照

请问有什么建议吗?

答案1

您可以使用pgfplotstable来实现这一点。如果您加载array包,您可以设置 的选项dec sep alignpgfplotstabletypeset获得小数点对齐。可以通过设置 来用零填充数字fixed zerofill,可以使用 来设置小数位数precision,可以针对所有列或针对单个列使用 来设置display column/<index>/precision=<digits>

pgfplotstable 和数组

\documentclass{article}
\usepackage{filecontents}       % For the example data
\usepackage{pgfplotstable}
\usepackage{array}      % For aligining at decimal point

\begin{filecontents}{testdata.csv}
theta, x, y
30.0,   0.0,    0.0
60.0,   1.9098, 5.8779
90.0,   6.9098, 9.5106
120.0,  13.09,  9.5106
150.0,  18.09,  5.8779
180.0,  20.0,   0.0
\end{filecontents}

\begin{document}
\pgfplotstableread[col sep=comma]{testdata.csv}{\table}

\pgfplotstabletypeset[
    dec sep align,      % Align at decimal point
    fixed zerofill,     % Fill numbers with zeros
    precision=4,        % Set number of decimals
    display columns/0/.style={precision=1}, % Change for first column (column 0)
    ] {\table}
\end{document}

或者,您可以使用pgfplotstablesiunitx包来对齐列。我在这里将它与 booktabs 和正确格式化的列标题结合使用:

pgfplotstable 和 siunitx

\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{siunitx}
\usepackage{booktabs}

\begin{filecontents}{testdata.csv}
theta, x, y
30.0,   0.0,    0.0
60.0,   1.9098, 5.8779
90.0,   6.9098, 9.5106
120.0,  13.09,  9.5106
150.0,  18.09,  5.8779
180.0,  20.0,   0.0
\end{filecontents}

\begin{document}
\pgfplotstableread[col sep=comma]{testdata.csv}{\table}

\pgfplotstabletypeset[
    dec sep align=S,    % Use the siunitx `S` column type for aligning at decimal point
    fixed zerofill,     % Fill numbers with zeros
    precision=4,        % Set number of decimals
    display columns/0/.style={
        precision=1,    % Change for first column (column index 0)
        column name=$\theta_{2,i}$
    },
    display columns/1/.style={column name=$X$},
    display columns/2/.style={column name=$Y$},
    every head row/.style={before row=\toprule, after row=\midrule},
    every last row/.style={after row=\bottomrule},
    ] {\table}
\end{document}

答案2

datatool使用包和包执行此操作也没有问题siunitx。这是以这种方式完成的示例:

\documentclass{article}
\usepackage{datatool}
\usepackage{siunitx}
\usepackage{booktabs} % for nicer tables
\usepackage{caption} % improve caption spacing (among other things)
\usepackage{bm}
\renewcommand*\dtldisplaystarttab{\toprule}
\renewcommand*\dtldisplayendtab{\tabularnewline\bottomrule}
\renewcommand*\dtldisplayafterhead{\midrule}

\begin{document}
\DTLloaddb
 [
    noheader,
    keys={x,y,theta},
    headers={
    \shortstack{$\boldsymbol{\theta_{{2,i}}}$},
    \shortstack{X},
    \shortstack{Y}}
  ]
  {db}{db.txt}
\begin{table}[t]
\sisetup{
    parse-numbers   = false,
    table-number-alignment = left,
    table-figures-integer = 4,
    table-figures-decimal = 4,
    input-decimal-markers = .
    }
    \renewcommand*\dtlrealalign{S}
  \caption{Database file}
  \centering
  \DTLdisplaydb{db}
\end{table}

\end{document}

代码输出

相关内容