niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

Pandoc 2.9.2 で 入力ファイル形式にcsvが追加されました

仲間が増えたよ!

掲題のとおり、Pandoc 2.9.2 で 入力ファイル形式にcsvが追加されました。

https://pandoc.org/releases.html#pandoc-2.9.2-2020-02-15

他にも変更点多々ありますが、ひとまずcsvファイルを入力にしたときの挙動を見ておきます。

とりあえずcsvファイルを準備。irisデータで。

write.csv(head(iris), "iris.csv")

Markdownへの変換

とりあえずMarkdown形式へ変換してみます。入力ファイル形式csvを指定し、markdown形式へ先のcsvファイルを変換します。

pandoc -f csv -t markdown iris.csv

結果は以下の通り。

      Sepal.Length   Sepal.Width   Petal.Length   Petal.Width   Species
  --- -------------- ------------- -------------- ------------- ---------
  1   5.1            3.5           1.4            0.2           setosa
  2   4.9            3             1.4            0.2           setosa
  3   4.7            3.2           1.3            0.2           setosa
  4   4.6            3.1           1.5            0.2           setosa
  5   5              3.6           1.4            0.2           setosa
  6   5.4            3.9           1.7            0.4           setosa

これで、Markdownの面倒くさい表形式への変換がPandocだけでも出来ることがわかりました。

とはいえ、これは全体がcsvであるファイルを単一のmarkdownファイルに変換しているだけなので、 Markdownファイル中でcsvファイルを取り込むといったことは(まだ)できません。

もちろん内部でPandocを呼び出して上記変換を行って結合すればよいですが、たとえばR Markdownであればそもそもその言語で処理を書けばよいということになるので…。

Pandoc's ASTへの変換時点でTable形式となっている

Pandocのデータ構造も確認しておきます。

pandoc -f csv -t native iris.csv

結果は以下のように、Tableとなっています。

[Table [] [AlignDefault,AlignDefault,AlignDefault,AlignDefault,AlignDefault,AlignDefault] [0.0,0.0,0.0,0.0
,0.0,0.0]
 [[]
 ,[Plain [Str "Sepal.Length"]]
 ,[Plain [Str "Sepal.Width"]]
 ,[Plain [Str "Petal.Length"]]
 ,[Plain [Str "Petal.Width"]]
 ,[Plain [Str "Species"]]]
 [[[Plain [Str "1"]]
  ,[Plain [Str "5.1"]]
  ,[Plain [Str "3.5"]]
  ,[Plain [Str "1.4"]]
  ,[Plain [Str "0.2"]]
  ,[Plain [Str "setosa"]]]
  ,[Plain [Str "3"]]
  ,[Plain [Str "1.4"]]
  ,[Plain [Str "0.2"]]
  ,[Plain [Str "setosa"]]]
 ,[[Plain [Str "3"]]
  ,[Plain [Str "4.7"]]
  ,[Plain [Str "3.2"]]
  ,[Plain [Str "1.3"]]
  ,[Plain [Str "0.2"]]
  ,[Plain [Str "setosa"]]]
 ,[[Plain [Str "4"]]
  ,[Plain [Str "4.6"]]
  ,[Plain [Str "3.1"]]
  ,[Plain [Str "1.5"]]
  ,[Plain [Str "0.2"]]
  ,[Plain [Str "setosa"]]]
 ,[[Plain [Str "5"]]
  ,[Plain [Str "5"]]
  ,[Plain [Str "3.6"]]
  ,[Plain [Str "1.4"]]
  ,[Plain [Str "0.2"]]
  ,[Plain [Str "setosa"]]]
 ,[[Plain [Str "6"]]
  ,[Plain [Str "5.4"]]
  ,[Plain [Str "3.9"]]
  ,[Plain [Str "1.7"]]
  ,[Plain [Str "0.4"]]
  ,[Plain [Str "setosa"]]]]]

この結果から、csvのReaderは従来からあるTable形式を返しているだけということがわかり、Pandocのフィルタをこのあとに書く場合はTableを受ける仕様でないといけない、ということがわかりますね。

現状のPandoc's MarkdownのTableの仕様そのものに不満がある場合はその不満点はそのまま残るということになります。

まとめ

  • Pandoc 2.9.2からcsvファイル形式を入力ファイル形式に指定することが出来る
  • このとき、単一のcsvファイルを指定したファイル形式の表形式として出力できる(表形式が出力できるファイル形式なら何でも問題なし。docx形式でも対応可能)
  • 中間表現として、PandocのNative ASTはTableとなっている。そのため、従来のPandocのTableの表現力によって制限される。フィルタを書く場合は対象はTableとすること。
  • その他、オプションやファイルの取り込みは未調査。

以上です。