Search code examples
c#csvcsvhelper

CsvHelper does not read data from .csv-File created by CsvHelper


Hi I am trying to use CsvHelper and did finally get it to write my data into a .csv-file but if try to read the data the result is always empty. It reads the header and then csv.Read() seems to skip all the data.

The Sperrnummer class definition:

public class Sperrnummer
{
    public string Nummer { get; set; }
    public DateTime Erstellt { get; set; }
    public string Benutzer { get; set; }

    public Sperrnummer(string nummer, DateTime erstellt, string benutzer)
    {
        Nummer = nummer;
        Erstellt = erstellt;
        Benutzer = benutzer;
    }

    public Sperrnummer(string nummer)
    {
        Nummer = nummer;
        Erstellt = DateTime.Now;
        Benutzer = HttpContext.Current.User.Identity.Name;
    }
    public Sperrnummer()
    {
        Nummer = "";
        Erstellt = DateTime.Now;
        Benutzer = HttpContext.Current.User.Identity.Name;
    }
}

Here's my sample file:

Nummer,Erstellt,Benutzer
03063651976,08.07.2018 13:54:49,MASCHINE\Plopp
03063651977,08.07.2018 13:54:49,MASCHINE\Plopp
03063651978,08.07.2018 13:54:49,MASCHINE\Plopp
03063651979,08.07.2018 13:54:49,MASCHINE\Plopp
03063651971,08.07.2018 13:54:49,MASCHINE\Plopp
03063651972,08.07.2018 13:54:49,MASCHINE\Plopp
03063651973,08.07.2018 13:54:49,MASCHINE\Plopp

And here's my "Reader":

public ActionResult Index()
{
    var filePath = Server.MapPath("~/liste.txt");
    List<Sperrnummer> sperrnummern = new List<Sperrnummer>();

    if (System.IO.File.Exists(filePath)){
        using (var reader = new StringReader(filePath))
        {
            var csv = new CsvReader(reader);

            csv.Read();
            csv.ReadHeader();
            while (csv.Read())
            {
                var nummer = csv.GetRecord<Sperrnummer>();
                sperrnummern.Add(nummer);
            }
        }
    }
    else
    {
        sperrnummern = new List<Sperrnummer>();
    }

    return View(sperrnummern);
}

The resulting "sperrnummern" is always empty.


Solution

  • Given the lack of a default constructor and the readonly properties of the target class, you would have to initialize the class manually, extracting the values and passing them to the constructor arguments.

    while (csv.Read()) {
        var nummer = new Sperrnummer(
            nummer: csv["Nummer"],
            erstellt: csv.GetField<DateTime>("Erstellt"),
            benutzer: csv["Benutzer"]
        );
        sperrnummern.Add(nummer);
    }