Как вызвать определенные строки данных в CSV в ConTeXt?

Как вызвать определенные строки данных в CSV в ConTeXt?

У меня есть 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-файла, либо отобразив информацию, найденную в определенной строке, либо отобразив файл, указанный в последнем столбце.

Примерами могут быть:

  • Показать страницу 1 кода 002 (будет показано 4.pdf).
  • Отобразить все страницы с тегом «яблоки» (будут показаны 2.pdf и 4.pdf).
  • Отобразить только второй встречающийся элемент в CSV с тегом «яблоки» (будет отображено 4.pdf).
  • Отобразить заголовок страницы 2, код 1 (будет отображаться «Советы по покупке»).

Есть ли в ConTeXt какой-либо метод, позволяющий вызывать данные из CSV-файла таким образом?

решение1

Вы можете проанализировать содержимое CSV-файла с помощью встроенного в ConTeXt 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",
}

Связанный контент