data.xlsx
내용이 다음과 같은 Excel 스프레드시트 파일이 있다고 가정합니다.
A B
1 Third Parameter 7
2 First Parameter 5
3 Second Parameter 3
A열의 해당 텍스트를 사용하여 B열의 값을 조회하고 싶습니다.
즉, 예를 들어 \getValue{<macro name to save the value in>}{<Search word>}{<Excel file name>}
. 예를 들어 나중에 라텍스 문서에서 사용하기 위해 in \getValue{\rdPar}{Third Parameter}{data.xlsx}
값을 저장합니다 .7
\rdPar
PS 아마,이 질문도움이 되지만 필요에 맞게 답변을 편집하는 방법을 모르겠습니다.
답변1
.csv
대신 사용할 수 있다고 가정하면 .xls(x)
CSV 파일을 조작하기 위한 여러 도구가 있습니다(예: ) csvsimple
.
일부 바퀴를 재발명하려는 경우 파일에서 키-값 구조를 \ReadCSV
읽은 다음 필요할 때 해당 값을 가져올 수 있습니다. 구문은 다음과 같습니다 ..csv
\getValue
\ReadCSV
\ReadCSV [*] {<label>} [<name>,<value>] {<file>}
\ReadCSV
CSV를 읽고 <file>
열 <name>
및 <value>
( <name>
및 <value>
은 열 수입니다. 기본값은 <name>=1
및 )를 가져와 나중에 <value>=2
저장합니다 . <label>
옵션을 *
사용하면 파일을 문자열로 읽습니다.
파일을 읽고 나면 다음을 사용하여 저장된 값을 가져올 수 있습니다 \getValue
.
\getValue <macro> {<name>} {<label>}
\getValue
에서 읽은 CSV 파일의 <value>
해당 열을 가져 와서 에 저장합니다 .<name>
<label>
<macro>
귀하의 예(머리글 행과 열 제거)에서는 다음과 같습니다.
\ReadCSV{mydata}{test.csv}
\getValue\rdPar{Third Parameter}{mydata}
\rdPar % prints 7
구현 은 다음과 같습니다 expl3
(최소화: 잘못된 입력, 데이터 누락 등을 확인하는 오류가 없습니다).
\begin{filecontents*}{test.csv}
Third Parameter , 7
First Parameter , 5
Second Parameter , 3
\end{filecontents*}
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
% Step 1: reading the file
\ior_new:N \l__diaa_csv_ior
\bool_new:N \l__diaa_csv_str_bool
\NewDocumentCommand \ReadCSV { s m >{ \SplitArgument {1} {,} }O{ 1,2 } m }
{
\IfBooleanTF {#1}
{ \bool_set_true:N \l__diaa_csv_str_bool }
{ \bool_set_false:N \l__diaa_csv_str_bool }
\diaa_csv_read:nnnn {#2} #3 {#4}
}
\cs_new_protected:Npn \diaa_csv_read:nnnn #1 #2 #3 #4
{
\prop_new:c { g__diaa_csv_#1_prop }
\ior_open:NnTF \l__diaa_csv_ior {#4}
{ \__diaa_csv_read:cnn { g__diaa_csv_#1_prop } {#2} {#3} }
{ \msg_error:nnn { diaa } { file-not-found } {#4} }
}
\msg_new:nnn { diaa } { file-not-found }
{ File~`#1'~not~found. }
\cs_new_protected:Npn \__diaa_csv_read:Nnn #1 #2 #3
{
\bool_if:NTF \l__diaa_csv_str_bool
{ \ior_str_map_inline:Nn }
{ \ior_map_inline:Nn }
\l__diaa_csv_ior
{
\prop_put:Nxx #1
{ \clist_item:nn {##1} {#2} }
{ \clist_item:nn {##1} {#3} }
}
}
\cs_generate_variant:Nn \__diaa_csv_read:Nnn { c }
%
% Step 2: getting the values
\NewDocumentCommand \getValue { m m m }
{ \tl_set:Nx #1 { \diaa_csv_item:nn {#2} {#3} } }
\NewExpandableDocumentCommand \CSVItem { m m }
{ \diaa_csv_item:nn {#1} {#2} }
\cs_new:Npn \diaa_csv_item:nn #1 #2
{ \prop_item:cn { g__diaa_csv_#2_prop } {#1} }
\ExplSyntaxOff
\begin{document}
\ReadCSV{mydata}{test.csv}
\getValue\rdPar{Third Parameter}{mydata}
\rdPar
\edef\rdPar{\CSVItem{First Parameter}{mydata}}%
\rdPar
\end{document}