양방향 텍스트가 포함된 CSV 파일의 값에서 테이블 생성

양방향 텍스트가 포함된 CSV 파일의 값에서 테이블 생성

다음 속성을 가진 csv 파일 내부의 값으로 테이블을 생성하고 싶습니다.

  • 여기에는 양방향 텍스트가 포함됩니다. 일부 열에는 영어 텍스트(왼쪽에서 오른쪽으로 쓰는 언어)가 있고 다른 열에는 아랍어(오른쪽에서 왼쪽으로 쓰는 언어)가 있습니다.
  • 일부 값이 비어 있으며 테이블 내부에서도 비어 있는 것으로 나타나기를 원합니다.
  • 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}

출력(아랍어 텍스트가 누락됨) MWE의 조판 출력

문제 해결이 필요함

  • 컴파일된 파일만 얻을 수 있었습니다.~ 후에패키지 및 관련 코드(위 참조) 에 주석을 달았 polyglossia지만 모든 아랍어 텍스트가 표시되지 않았습니다. 해당 코드의 주석 처리를 제거하면 파일이 컴파일되지 않고 다음 오류가 발생합니다.

    오류: 숫자가 누락되어 0으로 처리됩니다. --- TeX가 말했다 --- ١ l.37 \end{tabularx}

    --- HELP --- 이는 일반적으로 LaTeX 명령이 인수로 숫자나 길이를 기대하지만 찾지 못하여 발생합니다. 인수를 생략했거나 텍스트의 대괄호가 선택적 인수의 시작 부분으로 잘못되었을 수 있습니다. 이 오류는 길이 명령이나 숫자를 생성하는 \value와 같은 명령 앞에 \protect를 두는 경우에도 발생합니다.

  • 수평선을 없애는 방법결정적인 \midrule, ? 직전의 \bottomrule?

추신

datatool패키지 나 pgfplotstable다른 패키지를 사용하거나 패키징하는 솔루션은 환영하지만 가장 중요한 것은 헤더를 그대로 두는 것입니다.수동으로형식이 지정되고 자동으로 조판되지 않습니다. 제 경우에는 헤더 형식이 여기 MWE에 표시된 것보다 더 복잡합니다.

답변1

다른 패키지도 환영한다고 언급했으므로 다음은 다음을 사용하는 예입니다 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}

내용을 여러 번 처리 하므로 tabularx내용을 먼저 구성하는 것이 더 효율적입니다. 예를 들어 다음과 같습니다.

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

즉, 발생하는 오버헤드 \DTLforeach가 최소화됩니다. 문서 작성 프로세스 측면에서 실제 절약은 데이터베이스 크기에 따라 다릅니다.

테이블 이미지

관련 정보