将符合 rfc4180 标准的 CSV 呈现为表格

将符合 rfc4180 标准的 CSV 呈现为表格

是否有一个 LaTeX 包,它可以导入数据csv并遵守转义的引文?

确切地说,我指的是使用规则 1. - 7.https://www.rfc-editor.org/rfc/rfc4180#section-2

pgfplotstable似乎都不起作用simplecsv——它们都错误地将引用的逗号解析为字段分隔符。

column1, column2
value,"A quoted, value"
value2,A value
value3,"a ""value"""

第 1 行(数据)导致pgfplotstable错误:Table 'data.csv' appears to have too many column。标题、第 2 行和第 3 行呈现正常。

期望输出是:

column1  |  column2
---------+---------------------
value    |  A quoted, value
value2   |  A value
value3   |  a "value"

我发现的唯一解决方案是手动用{}括号将字段括起来,但这显然很麻烦。

编辑:在原始文件中,只有包含逗号和引号的字段被引用

编辑2:我知道将引号改为正确的“”对可能会很复杂;我对此不感兴趣。

答案1

似乎它尚未实现,但可以花些力气完成。我修改现有宏的速度太快了,所以 Christian 应该知道我是否在这里破坏了任何东西。新设置可以通过 来使用col sep=double quotes。但它不支持另一个带引号的列,因为它是一个模糊的开头和结尾字符。

\documentclass{standalone}
\usepackage{pgfplotstable}



\makeatletter
\pgfkeys{/pgfplots/table/col sep/double quotes/.code = {\def\pgfplotstableread@COLSEP@CASE{7}}}

{%
    \catcode`\ =10
    \catcode`\;=12
    \catcode`\:=12
    \gdef\pgfplotstableread@impl@prepare@DO{%
        \ifcase\pgfplotstableread@COLSEP@CASE\relax
            % col sep=space:
            \catcode`\ =10
            \long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1 \pgfplotstable@EOI}%
        \or
            % col sep=comma:
            \let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@COMMA
            \long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1,\pgfplotstable@EOI}%
        \or
            % col sep=semicolon:
            \catcode`\;=12
            \let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@SEMICOLON
            \long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1;\pgfplotstable@EOI}%
        \or
            % col sep=colon:
            \catcode`\:=12
            \let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@COLON
            \long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1:\pgfplotstable@EOI}%
        \or
            % col sep=brace:
            % allow multi line cells:
            \endlinechar=\pgfplotstableread@oldendlinechar\relax
            \let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@BRACE
            \long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1\pgfplotstable@EOI}%
        \or
            % col sep=tab:
            \catcode`\^^I=12
            \let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@TAB
            \long\edef\pgfplotstableread@impl@DO@##1{\noexpand\pgfplotstableread@impl@ITERATE##1\pgfplotstableread@tab\noexpand\pgfplotstable@EOI}%
        \or
            % col sep=&:
            \let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@AMPERSAND
            \long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1&\pgfplotstable@EOI}%
        \or
            % col sep="
            \let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@DOUBLEQUOTES
            \long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1\pgfplotstable@EOI}%
        \fi
    }%
}%

\long\def\pgfplotstableread@impl@ITERATE@NEXT@DOUBLEQUOTES#1"{%
    \pgfplotstableread@impl@ITERATE@NEXT@{#1}%
    \pgfplotstableread@impl@ITERATE
}%

\makeatother


\begin{document}

\pgfplotstableread[col sep=double quotes]{
A,"the comma , and some    space,"
B," followed by another awkward."
}\mytable


\pgfplotstabletypeset[string type]{\mytable}

\end{document}

在此处输入图片描述

我没有删除逗号,因为我不确定你是否需要它们。你也可以再次引入引号,但如果要进行排版,最好使用 csquotes 包或至少`` ... " 使用对来正确呈现开头的引号。

相关内容