Gerando uma tabela a partir de valores em arquivo CSV com texto bidirecional

Gerando uma tabela a partir de valores em arquivo CSV com texto bidirecional

Quero gerar uma tabela a partir de valores dentro do arquivo csv que possuem as seguintes propriedades:

  • Incluem texto bidirecional; algumas colunas contêm texto em inglês (um idioma escrito da esquerda para a direita), enquanto outras contêm árabe (um idioma escrito da direita para a esquerda).
  • Alguns valores estão vazios e quero que apareçam vazios também dentro da tabela
  • Não há cabeçalho dentro do arquivo csv.

MWE

\documentclass[10pt,a4paper,landscape]{report}
\usepackage[margin=5mm,landscape]{geometry}
\setlength{\parindent}{0pt}
\usepackage{csvsimple}
\usepackage{tabularx}
\usepackage{booktabs}

% \usepackage{polyglossia}
% \setmainlanguage{arabic}
% \setotherlanguages{english}
% \newfontfamily\arabicfont[Script=Arabic,Scale=1,Ligatures=TeX]{Simplified Arabic}
% \setmonofont[Scale=1]{DejaVu Sans Mono}                          
% \setsansfont[Script=Arabic,Scale=1,Ligatures=TeX]{Simplified Arabic}
% \newfontfamily\englishfont{Arial}

\begin{filecontents*}{DB.csv}
1,عنوان باللغة العربية,YYY-XX-01,27,عنوان اخر,English Name,اسم شخص س
2,,UUU-ZZ-02,29,عنوان 2,English Too,اسم شخص ص
3,,BBB-GG-03,30,عنوان 3,English Term,اسم شخص و
4,,CCC-UG-04,25,عنوان عربي,English Text,اسم شخص ن
\end{filecontents*}

\begin{document}
\begin{tabularx}{\textwidth}{@{}XXXXXXX@{}}
  \toprule
  Heading1 &  Heading2 & Heading3 & Heading4 & Heading5 & Heading6 & Heading7 \\
  \midrule
  \csvreader[no head,%
  late after line=\\\midrule,%
  table foot=\bottomrule]%
  {DB.csv}{1=\idcode,2=\labname,3=\roomcode,4=\roomno,5=\arab,6=\eng,7=\person}%
  {\idcode & \labname & \roomcode & \roomno & \arab & \eng & \person}
  \bottomrule
\end{tabularx}
\end{document}

Saída (falta texto em árabe) saída tipográfica do MWE

Problemas precisam ser resolvidos

  • Eu só consegui compilar o arquivodepoiscomentando polyglossiao pacote e seu código relacionado (veja acima), mas todo o texto em árabe não foi mostrado, quando eu descomentei esse código, o arquivo não será compilado gerando o seguinte erro:

    ERRO: Número ausente, tratado como zero. --- TeX disse --- ١ 1.37 \end{tabularx}

    --- HELP --- Isso geralmente é causado por um comando LaTeX que espera, mas não encontra, um número ou comprimento como argumento. Você pode ter omitido um argumento ou um colchete no texto pode ter sido confundido com o início de um argumento opcional. Este erro também é causado pela colocação de \protect na frente de um comando de comprimento ou de um comando como \value que produz um número.

  • Como se livrar da linha horizontal pelofinal \midrule, aquele logo antes do \bottomrule?

PS

Soluções que utilizem datatoolor pgfplotstablepackage ou qualquer outro pacote são bem vindas, mas o mais importante é deixar o cabeçalho como está.manualmenteformatado e não digitado automaticamente, no meu caso a formatação do cabeçalho é mais complicada do que a mostrada aqui no MWE.

Responder1

Já que você mencionou que outros pacotes são bem-vindos, aqui está um exemplo usando datatool:

\documentclass[10pt,a4paper,landscape]{report}
\usepackage[margin=5mm,landscape]{geometry}
\setlength{\parindent}{0pt}

\usepackage{tabularx}
\usepackage{booktabs}
\usepackage{filecontents}

\usepackage{fontspec}
\usepackage{polyglossia}

\usepackage{datatool}

\setmainlanguage{arabic}
\setotherlanguages{english}

\newfontfamily\arabicfont[Script=Arabic,Scale=1,Ligatures=TeX]{FreeSerif}
\newfontfamily\englishfont{FreeSerif}

\begin{filecontents*}{DB.csv}
1,عنوان باللغة العربية,YYY-XX-01,27,عنوان اخر,English Name,اسم شخص س
2,,UUU-ZZ-02,29,عنوان 2,English Too,اسم شخص ص
3,,BBB-GG-03,30,عنوان 3,English Term,اسم شخص و
4,,CCC-UG-04,25,عنوان عربي,English Text,اسم شخص ن
\end{filecontents*}

\DTLloaddb[noheader]{data}{DB.csv}

\begin{document}

\begin{tabularx}{\textwidth}{@{}XXXXXXX@{}}
\toprule
\textenglish{Heading1} &  
\textenglish{Heading2} &
\textenglish{Heading3} &
\textenglish{Heading4} & 
\textenglish{Heading5} & 
\textenglish{Heading6} &
\textenglish{Heading7}
\DTLforeach*{data}{\idcode=Column1,\labname=Column2,\roomcode=Column3,%
  \roomno=Column4,\arab=Column5,\eng=Column6,\person=Column7}%
{%
  \\\midrule
  \textenglish{\idcode} & 
  \textarabic{\labname} & 
  \textenglish{\roomcode} &
  \textenglish{\roomno} &
  \textarabic{\arab} & 
  \textenglish{\eng} & 
  \textarabic{\person} 
}\\\bottomrule
\end{tabularx}

\end{document}

Como tabularxprocessa seu conteúdo diversas vezes, é mais eficiente construí-lo primeiro. Por exemplo, assim:

\documentclass[10pt,a4paper,landscape]{report}
\usepackage[margin=5mm,landscape]{geometry}
\setlength{\parindent}{0pt}

\usepackage{tabularx}
\usepackage{booktabs}
\usepackage{filecontents}
\usepackage{etoolbox}

\usepackage{fontspec}
\usepackage{polyglossia}

\usepackage{datatool}

\setmainlanguage{arabic}
\setotherlanguages{english}

\newfontfamily\arabicfont[Script=Arabic,Scale=1,Ligatures=TeX]{FreeSerif}
\newfontfamily\englishfont{FreeSerif}

\begin{filecontents*}{DB.csv}
1,عنوان باللغة العربية,YYY-XX-01,27,عنوان اخر,English Name,اسم شخص س
2,,UUU-ZZ-02,29,عنوان 2,English Too,اسم شخص ص
3,,BBB-GG-03,30,عنوان 3,English Term,اسم شخص و
4,,CCC-UG-04,25,عنوان عربي,English Text,اسم شخص ن
\end{filecontents*}

\DTLloaddb[noheader]{data}{DB.csv}

\begin{document}
\newcommand{\tabcontents}{\begin{tabularx}{\textwidth}{@{}XXXXXXX@{}}
 \toprule
 \textenglish{Heading1} &
 \textenglish{Heading2} &
 \textenglish{Heading3} &
 \textenglish{Heading4} &
 \textenglish{Heading5} &
 \textenglish{Heading6} &
 \textenglish{Heading7}}

\DTLforeach*{data}{\idcode=Column1,\labname=Column2,\roomcode=Column3,%
  \roomno=Column4,\arab=Column5,\eng=Column6,\person=Column7}%
{%
  \eappto\tabcontents{\noexpand\\\noexpand\midrule
  \noexpand\textenglish{\idcode} \noexpand&
  \noexpand\textarabic{\labname} \noexpand&
  \noexpand\textenglish{\roomcode} \noexpand&
  \noexpand\textenglish{\roomno} \noexpand&
  \noexpand\textarabic{\arab} \noexpand&
  \noexpand\textenglish{\eng} \noexpand&
  \noexpand\textarabic{\person}}
}%
\appto\tabcontents{\\\bottomrule\end{tabularx}}

\tabcontents

\end{document}

Isso significa que a sobrecarga incorrida \DTLforeaché minimizada. A economia real em termos do processo de criação de documentos depende do tamanho do banco de dados.

imagem da mesa

informação relacionada