Documento LaTeX contendo dados csv com campos vazios

Documento LaTeX contendo dados csv com campos vazios

Estou escrevendo uma carta padrão em látex. Os endereços vêm de uma fonte de dados externa. O problema é que ocorrem campos vazios (com bastante frequência, na verdade) na fonte de dados (veja abaixo). Portanto, por causa da \def\chopline#1,#2,#3,#4,#5,#6,#7,#8 \\linha \expandafter\chopline\zeile\\, de alguma forma espera pelo menos um caractere atrás de uma vírgula e o consome. Se não houver dados em um campo, ele apenas “comerá” a vírgula e incluirá o próximo campo de dados, causando uma bagunça completa. Qualquer conselho sobre como mitigar o problema seria útil.

Além disso, copiei este exemplo há algum tempo e não entendo todos os comandos e suas implicações. Tenho a impressão de que a estrutura que utilizo é bastante antiga e pode não ser a maneira mais segura de implementar o comportamento que desejo. Quais ferramentas mais avançadas que o LuaLaTeX oferece eu poderia usar para melhorar o código que implementa a carta padrão?

Este é o código:

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

Aí vem a fonte de dados (contendo alguns manequins):

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]

Responder1

Aqui está uma solução usandodatatool(assumindo que os dados estão em test.csv, altere conforme apropriado):

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

informação relacionada