У меня есть 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",
}