区切り文字として「@」を使用し、次のようなデータを含む CSV ファイルがあります。
Code @ Title @ Page @ Tags @ File
001 @ Buying Tips @ 1 @ seafood, fish, octopus @ 1.pdf
001 @ Buying Tips @ 2 @ oranges, apples @ 2.pdf
001 @ Buying Tips @ 3 @ bananas @ 3.pdf
002 @ Food Waste @ 1 @ compost, apples @ 4.pdf
002 @ Food Waste @ 2 @ plastic, paper, bags @ 5.pdf
CSV ファイルから特定のデータを呼び出して、特定の行にある情報を表示するか、最後の列にリストされているファイルを表示する必要があります。
例:
- コード 002 のページ 1 を表示します (4.pdf が表示されます)。
- 「apples」というタグが付いたすべてのページを表示します(2.pdf と 4.pdf が表示されます)。
- CSV 内でタグ「apples」を持つ 2 番目に出現する項目のみを表示します (4.pdf が表示されます)。
- ページ 2、コード 1 のタイトルを表示します (「購入のヒント」と表示されます)。
ConTeXt には、CSV ファイルからこのような方法でデータを呼び出す方法がありますか?
答え1
ConTeXtの組み込みの を使ってCSVファイルの内容を解析することができますrfc4180splitter
。あなたが挙げた例は、Luaコードを使って簡単に実現できます。ここでは、パーサーの使い方を紹介します。他にもたくさんのパーサーがあります。util-prs.lua
ぜひ一度見てみてください。
\startbuffer[csv]
Code @ Title @ Page @ Tags @ File
001 @ Buying Tips @ 1 @ seafood, fish, octopus @ 1.pdf
001 @ Buying Tips @ 2 @ oranges, apples @ 2.pdf
001 @ Buying Tips @ 3 @ bananas @ 3.pdf
002 @ Food Waste @ 1 @ compost, apples @ 4.pdf
002 @ Food Waste @ 2 @ plastic, paper, bags @ 5.pdf
\stopbuffer
\startluacode
local csvsplitter = utilities.parsers.rfc4180splitter{separator = "@"}
local rows, colnames = csvsplitter(buffers.getcontent"csv", true)
-- Show what has been parsed on the terminal
inspect(rows)
inspect(colnames)
-- Now pick data and process to your liking
-- ...
\stopluacode
\starttext
\stoptext
ターミナルでは
table={
{ "001 ", " Buying Tips ", " 1 ", " seafood, fish, octopus ", " 1.pdf" },
{ "001 ", " Buying Tips ", " 2 ", " oranges, apples ", " 2.pdf" },
{ "001 ", " Buying Tips ", " 3 ", " bananas ", " 3.pdf" },
{ "002 ", " Food Waste ", " 1 ", " compost, apples ", " 4.pdf" },
{ "002 ", " Food Waste ", " 2 ", " plastic, paper, bags ", " 5.pdf" },
}
table={
"Code ",
" Title ",
" Page ",
" Tags ",
" File",
}