Документ LaTeX, содержащий данные CSV с пустыми полями

Документ LaTeX, содержащий данные CSV с пустыми полями

Я пишу стандартное письмо в латексе. Адреса берутся из внешнего источника данных. Проблема в том, что в источнике данных (см. ниже) встречаются пустые поля (на самом деле довольно часто). Поэтому из-за \def\chopline#1,#2,#3,#4,#5,#6,#7,#8 \\строки \expandafter\chopline\zeile\\каким-то образом ожидает хотя бы один символ после запятой и потребляет его. Если в одном поле нет данных, он просто «съест» запятую и включит следующее поле данных, что приведет к полному беспорядку. Любые советы о том, как смягчить проблему, были бы полезны.

Кроме того, я скопировал этот пример некоторое время назад и не понимаю всех команд и их последствий. У меня сложилось впечатление, что структура, которую я использую, довольно старая и, возможно, не самый безопасный способ реализовать желаемое поведение. Какие более продвинутые инструменты, предлагаемые LuaLaTeX, я мог бы использовать для улучшения кода, реализующего форму письма?

Вот код:

\documentclass{scrlttr2}

\usepackage{etoolbox}

\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\setsansfont{Linux Biolinum O}
\setmonofont{Linux Libertine Mono O}

\def\chopline#1,#2,#3,#4,#5,#6,#7,#8 \\{
    \def\lastname{#1}
    \def\firstname{#2}
    \def\fanilyname{#3}
    \def\addrsuppa{#4}
    \def\street{#5}
    \def\addrsuppb{#6}
    \def\postcode{#7}
    \def\town{#8}
}

\newif\ifmore \moretrue

\begin{document}

\setkomavar{subject}{Subject}

\newread\quelle
\openin\quelle=../teilnehmer.csv

\read\quelle to \zeile

\loop
    \read\quelle to \zeile
    \ifeof\quelle
        \global\morefalse
    \else
        \expandafter\chopline\zeile\\
        \begin{letter}{\firstname\ \lastname \\
        \postcode\ \town}

        \opening{Sehr geehrte Familie \lastname,}

        [content]

        \closing{Best regards}

        \end{letter}  
    \fi
\ifmore\repeat

\closein\quelle

\end{document}

Вот источник данных (содержащий несколько пустых мест):

last_name,first_name,family_name,address_supplement_1,street,address_supplement_2,postcode,town,telephone_1,telephone_2,mail
Barnes,Helen,,Apartment 3,Potsdamer Platz 10,Neukölln,99823,Görlitz,3714 2487824,8797 9717692,[email protected]
Thomas,Brandon,,,Dorfstraße 34d,,20903,Aachen,9214 3252403,,[email protected]
Kelley,Juan,,,Hauptstraße 11,,00495,Hamburg,6265 9683011,6263 6235169,[email protected]
Fisher,Anne,,,Berliner Straße 99,,39856,Oldenburg,0666 6226586,7917 5816244,
Sanchez,Martha,Miller,,Mittelweg 23,,11932,Leverkusen,3728 6123496,,[email protected]
Morrison,Daniel,,,Schulstraße 8,,11943,Neustadt,9589 2520624,
Brown,David,Clark,Room 42,Bahnhofstraße 12,Amorbach,12821,Neckarsulm,9304 3674329,,[email protected]
Graham,Frank,,,Lindenallee 19,,32956,Neustadt,,,[email protected]
Price,Douglas,,,Mühlweg 5e,,04923,Neustadt,7934 4700638,7689 9255281,[email protected]

решение1

Вот решение с использованиемdatatool(предполагается, что данные находятся в формате test.csv, измените по мере необходимости):

\documentclass{scrlttr2}

\usepackage{etoolbox}

\usepackage{fontspec}
\setmainfont{Liberation Sans}% (I don't have the fonts from the original MWE)

\usepackage{datatool}

\DTLloaddb{mydata}{test.csv}

\begin{document}
\setkomavar{subject}{Subject}

\DTLforeach*{mydata}%
 {\LastName=last_name,\FirstName=first_name,%
  \AddrI=address_supplement_1,\Street=street,%
  \AddrII=address_supplement_2,\PostCode=postcode,\Town=town}%
 {%
    \begin{letter}{\FirstName\ \LastName\\%
    \DTLifnullorempty{\AddrI}{}{\AddrI\\}%
    \DTLifnullorempty{\Street}{}{\Street\\}%
    \DTLifnullorempty{\AddrII}{}{\AddrII\\}%
    \PostCode\\\Town}

    \opening{Sehr geehrt Familie \LastName,}

    [content]

    \closing{Best regards}
    \end{letter}
 }

\end{document}

Связанный контент