2016-04-06 12 views
4

Ich habe die folgende CSV.CsvHelper nicht korrekt analysieren

Org Defined ID,Username,FirstName,LastName,Attempt #,Attempt Start,Attempt End,Section #,Q #,Q Type,Q Title,Q Text,Bonus?,Difficulty,Answer,Answer Match,Score,Out Of 
,testomalley,Test,O'Malley,1,2/3/2016 15:24,2/3/2016 15:28,,1,LA,Q(1) 1- 5 Part 1,"Scenario 1 for Questions 1 through 5. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Part 1 - Sed ut perspiciatis unde omnis iste natus error sit voluptatem.",FALSE,1,Here is my answer o grader. Isn't it brilliant?,,0,2 

Jetzt ist hier mein Ziel Ich versuche, es zu konvertieren:

public class Exam 
{ 
    public int? OD_ID { get; set; } 
    public string Username { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int AttemptNo { get; set; } 
    public DateTime AttemptStart { get; set; } 
    public DateTime AttemptEnd { get; set; } 
    public int? SectionNo { get; set; } 
    public int QuestionNo { get; set; } 
    public string QuestionType { get; set; } 
    public string QuestionTitle { get; set; } 
    public string Questiontext { get; set; } 
    public string Bonus { get; set; } 
    public int Difficulty { get; set; } 
    public string Answer { get; set; } 
    public string AnswerMatch { get; set; } 
    public int Score { get; set; } 
    public int OutOf { get; set; } 
} 

Ich habe diese Karte definiert:

public sealed class ExamMap : CsvHelper.Configuration.CsvClassMap<Exam> 
{ 
    public ExamMap() 
    { 
     Map(m => m.OD_ID).Name("Org Defined ID"); 
     Map(m => m.Username).Name("Username"); 
     Map(m => m.FirstName).Name("FirstName"); 
     Map(m => m.LastName).Name("LastName"); 
     Map(m => m.AttemptNo).Name("Attempt #"); 
     Map(m => m.AttemptStart).Name("Attempt Start"); 
     Map(m => m.AttemptEnd).Name("Attempt End"); 
     Map(m => m.SectionNo).Name("Section #"); 
     Map(m => m.QuestionNo).Name("Q #"); 
     Map(m => m.QuestionType).Name("Q Type"); 
     Map(m => m.QuestionTitle).Name("Q Title"); 
     Map(m => m.Questiontext).Name("Q Text"); 
     Map(m => m.Bonus).Name("Bonus?").TypeConverterOption(true, "TRUE").TypeConverterOption(false, "FALSE"); 
     Map(m => m.Difficulty).Name("Difficulty"); 
     Map(m => m.Answer).Name("Answer"); 
     Map(m => m.AnswerMatch).Name("Answer Match"); 
     Map(m => m.Score).Name("Score"); 
     Map(m => m.OutOf).Name("Out Of"); 
    } 
} 

und diese TypeConversion Option für meine Datetime-Feld:

var options = new CsvHelper.TypeConversion.TypeConverterOptions 
{ 
    //  2/3/2016 15:24 
    Format = "MM/dd/yyyy HH:nn", // also tried "g" with no success. 
}; 

Thi s Code, um die CSV-Datei zu analysieren:

using (StreamReader sr = new StreamReader(fileName)) 
{ 
    using (CsvReader csvread = new CsvReader(sr)) 
    { 
     csvread.Configuration.WillThrowOnMissingField = false; 
     csvread.Configuration.HasHeaderRecord = true; 
     CsvHelper.TypeConversion.TypeConverterOptionsFactory.AddOptions<DateTime>(options); 

     List<Exam> Exams = csvread.GetRecords<Exam>().ToList(); 
     foreach (var rec in Exams) 
     { 
      // Each record will be fetched and printed on the screen 
      // checking values of rec here... 
     } 
    } 
} 

Hier ist, wie es analysiert wird: Values

Warum ist es nicht die Datetime Felder richtig Parsen und warum werden diese Eigenschaften nicht gefüllt werden?

QuestionNo
Fragetyp
QuestionTitle
Questiontext
AnswerMatch
AttemptNo
OUTOF

+0

Ihr Datetime-Format ist MM/TT/JJJJ HH: nn. Sollte sein "MM/TT/JJJJ HH: mm, mit mm, nicht nn. –

+0

Das hat das Ergebnis nicht verändert. Selbst die Änderung zu" M/d/JJJJ HH: mm "hat nicht funktioniert. – MB34

Antwort

1

Sie eine Methode hinzufügen können für Datetime wie diese Parsen (man kann sogar einen Breakpoint nun eingestellt und ändern Sie die Optionen) :

Map(t => t.AttemptStart).Name("Attempt Start") 
    .ConvertUsing(new Func<CsvHelper.ICsvReaderRow, DateTime>(r => 
     { 
      DateTime dateTimeValue; 
      if (DateTime.TryParse(r["Attempt Start"], null, 
       System.Globalization.DateTimeStyles.AllowWhiteSpaces, out dateTimeValue)) 
      { 
       return dateTimeValue; 
      } 

      return default(DateTime); 
     })); 

Die fehlenden Felder können aufgrund des DateTime-Analyseproblems fehlerhaft sein. Es sieht auf den ersten Blick korrekt aus.

+0

Ich legte eine Pause Punkt, aber es hört nie auf – MB34

+0

Ihre Variablen zeigen an, dass Sie TryParseExact verwenden sollten – MB34

+0

Versuchte dieses auch mit gleichen Nullresultaten: 'DateTime.TryParse (r [" Versuch Start "], heraus DatumTimeValue)'. Tatsächlich, das hinzufügend ConvertUsing hat bewirkt, dass die Werte auf null gesetzt wurden, bevor sie auf '1/1/0001 12:00:00 AM 'gesetzt wurden. Ich habe die dateTimeValue-Definition auf diese geändert, damit ich keine Nullen erhalten würde:' DateTime dateTimeValue = DateTime.Now ; 'und' return dateTimeValue' – MB34

0

Alles scheint für mich gut zu funktionieren. Alles was ich getan habe war das.

csv.Configuration.RegisterClassMap<ExamMap>(); 
csv.GetRecords<Exam>().ToList().Dump(); 

Ich bekomme alle Felder, die Sie vermissen, auch gut geht.

CsvHelper wird alle diese Typen standardmäßig analysieren. Sie können auch leichter Typkonverter-Optionen hinzufügen, wenn dies erforderlich ist.

TypeConverterOptions

Hier ist das vollständige Beispiel aus LINQPad.

void Main() 
{ 
    using (var stream = new MemoryStream()) 
    using (var reader = new StreamReader(stream)) 
    using (var writer = new StreamWriter(stream)) 
    using (var csv = new CsvReader(reader)) 
    { 
     writer.WriteLine("Org Defined ID,Username,FirstName,LastName,Attempt #,Attempt Start,Attempt End,Section #,Q #,Q Type,Q Title,Q Text,Bonus?,Difficulty,Answer,Answer Match,Score,Out Of"); 
     writer.WriteLine(", testomalley, Test, O'Malley,1,2/3/2016 15:24,2/3/2016 15:28,,1,LA,Q(1) 1- 5 Part 1,\"Scenario 1 for Questions 1 through 5. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Part 1 - Sed ut perspiciatis unde omnis iste natus error sit voluptatem.\",FALSE,1,Here is my answer o grader. Isn't it brilliant ?,, 0, 2"); 
     writer.Flush(); 
     stream.Position = 0; 

     csv.Configuration.RegisterClassMap<ExamMap>(); 
     csv.GetRecords<Exam>().ToList().Dump(); 
    } 
} 

public class Exam 
{ 
    public int? OD_ID { get; set; } 
    public string Username { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int AttemptNo { get; set; } 
    public DateTime AttemptStart { get; set; } 
    public DateTime AttemptEnd { get; set; } 
    public int? SectionNo { get; set; } 
    public int QuestionNo { get; set; } 
    public string QuestionType { get; set; } 
    public string QuestionTitle { get; set; } 
    public string Questiontext { get; set; } 
    public string Bonus { get; set; } 
    public int Difficulty { get; set; } 
    public string Answer { get; set; } 
    public string AnswerMatch { get; set; } 
    public int Score { get; set; } 
    public int OutOf { get; set; } 
} 

public sealed class ExamMap : CsvHelper.Configuration.CsvClassMap<Exam> 
{ 
    public ExamMap() 
    { 
     Map(m => m.OD_ID).Name("Org Defined ID"); 
     Map(m => m.Username).Name("Username"); 
     Map(m => m.FirstName).Name("FirstName"); 
     Map(m => m.LastName).Name("LastName"); 
     Map(m => m.AttemptNo).Name("Attempt #"); 
     Map(m => m.AttemptStart).Name("Attempt Start"); 
     Map(m => m.AttemptEnd).Name("Attempt End"); 
     Map(m => m.SectionNo).Name("Section #"); 
     Map(m => m.QuestionNo).Name("Q #"); 
     Map(m => m.QuestionType).Name("Q Type"); 
     Map(m => m.QuestionTitle).Name("Q Title"); 
     Map(m => m.Questiontext).Name("Q Text"); 
     Map(m => m.Bonus).Name("Bonus?").TypeConverterOption(true, "TRUE").TypeConverterOption(false, "FALSE"); 
     Map(m => m.Difficulty).Name("Difficulty"); 
     Map(m => m.Answer).Name("Answer"); 
     Map(m => m.AnswerMatch).Name("Answer Match"); 
     Map(m => m.Score).Name("Score"); 
     Map(m => m.OutOf).Name("Out Of"); 
    } 
} 
+0

Josh, anscheinend hast du meinen letzten Kommentar zu @ Scoregrafics Beitrag nicht gelesen. Ich habe das Problem behoben und eine Anfrage zur Aktualisierung Ihrer Dokumentation als Problem auf GitHub gestellt. – MB34

Verwandte Themen