Anwendungsbeispiel: CSV-Dateien

Content

CSV-Dateien (comma separated values) besteht eine Datei aus Datensätzen, die jeweils durch einen Zeilentrenner abgeschlossen sind. Jeder Datensatz besteht aus einer festen Zahl von Werten mit festgelegten Datentypen, die jeweils durch Kommata voneinander getrennt sind.

Zwar gibt es noch zusätzliche Regelungen mit einer Header-Zeile und der Möglichkeit, Anführungszeichen zu verwenden. Dies lassen wir aber weg. So könnte eine CSV-Datei aussehen. In jeder Zeile ist der Name einer Stadt, die Zahl der Einwohner, die Höhe über Normalnull und die Fläche:

Freiburg,227590,278,153.06
Heidelberg,159914,114,108.84
Karlsruhe,309999,115,173.46
Konstanz,83789,405,54.11
Mannheim,304781,97,144.96
Stuttgart,628032,247,207.35
Tübingen,88347,341,108.12
Ulm,123953,478,118.69

Aufgabe

Entwickeln Sie mit Hilfe von update_with_index eine Template-Funktion scan_csv_line mit dem Return-Typ bool, die eine beliebig lange Liste von lvalue reference-Parametern erhält, die die einzelnen Komponenten eines Datensatzes aufnehmen sollen. Mit Hilfe des Index und der Gesamtzahl der Parameter wissen Sie, ob das jeweilige einzulesende Feld mit einem Komma oder mit einem Zeilentrenner abgeschlossen wird.

Hinweise:

Vorlage

#ifndef UPDATE_HPP
#define UPDATE_HPP

#include <cstdlib>
#include <utility>

namespace update_with_index_impl {

   template<typename F, typename Variable>
   void update(F&& f, std::size_t size, std::size_t index, Variable& var) {
      f(size, index, var);
   }

   template<typename F, typename Variable, typename... Variables>
   void update(F&& f, std::size_t size, std::size_t index,
	 Variable& var, Variables&... vars) {
      f(size, index, var); update(std::move(f), size, index+1, vars...);
   }

} // namespace update_with_index_impl

template<typename F, typename... Variables>
void update_with_index(F&& f, Variables&... vars) {
   update_with_index_impl::update(std::move(f),
      sizeof...(vars), 0, vars...);
}

#endif