Generando una tabla a partir de valores en un archivo CSV con texto bidireccional

Generando una tabla a partir de valores en un archivo CSV con texto bidireccional

Quiero generar una tabla a partir de valores dentro del archivo csv que tenga las siguientes propiedades:

  • Incluyen texto bidireccional; algunas columnas tienen texto en inglés (un idioma que se escribe de izquierda a derecha), mientras que otras contienen texto en árabe (un idioma que se escribe de derecha a izquierda).
  • Algunos valores están vacíos y quiero que también aparezcan vacíos dentro de la tabla.
  • No hay ningún encabezado dentro del archivo 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}

Salida (falta el texto árabe) salida tipográfica del MWE

Los problemas necesitan solución

  • Sólo pude compilar el archivo.despuéspaquete de comentarios polyglossiay su código relacionado (ver arriba), pero no se mostró todo el texto árabe, cuando elimino el comentario de ese código, el archivo no se compila y arroja el siguiente error:

    ERROR: Número faltante, tratado como cero. --- TeX dijo --- ١ l.37 \end{tabularx}

    --- AYUDA --- Esto generalmente se debe a que un comando LaTeX espera pero no encuentra ni un número ni una longitud como argumento. Es posible que haya omitido un argumento o que un corchete en el texto se haya confundido con el comienzo de un argumento opcional. Este error también se produce al colocar \protect delante de un comando de longitud o de un comando como \value que produce un número.

  • Cómo deshacerse de la línea horizontal por elfinal \midrule, el que está justo antes del \bottomrule?

PD

Se aceptan soluciones que utilicen datatoolo pgfplotstablepaquete o cualquier otro paquete, pero lo más importante es dejar el encabezado así.a manoformateado y no compuesto automáticamente, en mi caso el formato del encabezado es más complicado que el que se muestra aquí en el MWE.

Respuesta1

Como mencionaste que otros paquetes son bienvenidos, aquí tienes un ejemplo que utiliza 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}

Dado que tabularxprocesa su contenido varias veces, es más eficiente construir el contenido primero. Por ejemplo, así:

\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}

\DTLforeachEsto significa que se minimizan los gastos generales incurridos . El ahorro real en términos del proceso de creación de documentos depende del tamaño de la base de datos.

imagen de mesa

información relacionada