Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CsvHelper未正确解析_C#_Csv_Csvhelper - Fatal编程技术网

C# CsvHelper未正确解析

C# CsvHelper未正确解析,c#,csv,csvhelper,C#,Csv,Csvhelper,我有以下的CSV 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

我有以下的CSV

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
现在,这是我试图将其转换为的对象:

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");
    }
}
这是解析CSV文件的代码:

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...
        }
    }
}
使用(StreamReader sr=新的StreamReader(文件名))
{
使用(CsvReader csvread=新CsvReader(sr))
{
csvread.Configuration.WillThrowOnMissingField=false;
csvread.Configuration.HasHeaderRecord=true;
CsvHelper.TypeConversion.TypeConverterOptionsFactory.AddOptions(选项);
列表检查=csvread.GetRecords().ToList();
foreach(考试中的var rec)
{
//每个记录都将被提取并打印在屏幕上
//正在此处检查rec的值。。。
}
}
}
下面是它的解析方式:

为什么不能正确解析DateTime字段,为什么没有填充这些属性

问题编号
问题类型
问题标题
问题文本
回答匹配
尝试否

OutOf

您可以像这样添加一个日期时间解析方法(您甚至可以现在设置断点并修改选项):

Map(t=>t.AttemptStart).Name(“尝试启动”)
.ConvertUsing(新函数)(r=>
{
DateTime日期时间值;
if(DateTime.TryParse(r[“尝试启动”]),null,
System.Globalization.DateTimeStyles.AllowHiteSpaces,out dateTimeValue)
{
返回日期时间值;
}
返回默认值(日期时间);
}));

缺少的字段可能是基于日期时间分析问题的错误。乍一看是对的。

我觉得一切都很好。我所做的就是这样

csv.Configuration.RegisterClassMap<ExamMap>();
csv.GetRecords<Exam>().ToList().Dump();
csv.Configuration.RegisterClassMap();
csv.GetRecords().ToList().Dump();
我发现你错过的所有字段也都显示得很好

默认情况下,CsvHelper将解析所有这些类型。如果需要,您还可以更轻松地添加类型转换器选项

下面是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");
    }
}
void Main()
{
使用(var stream=new MemoryStream())
使用(变量读取器=新的流读取器(流))
使用(var writer=新的StreamWriter(流))
使用(var csv=新的CsvReader(读卡器))
{
WriteLine(“组织定义的ID、用户名、名字、姓氏、尝试、尝试开始、尝试结束、部分、Q、Q类型、Q标题、Q文本、奖金、难度、答案、答案匹配、分数、出局”);
作者:WriteLine(“,testomalley,Test,O'Malley,1,2/3/2016 15:24,2/3/2016 15:28,1,洛杉矶,Q(1)1-5第1部分,\”问题1至问题5的情景1.知识产权保护、发展精英、劳动和财富的暂时性保护。但是,最低限度的利益,是劳动和财富的实践。第1部分——所有人都会犯错误\,错,1,这是我的答案,评分员。这不是很精彩吗?,,0,2);
writer.Flush();
流位置=0;
csv.Configuration.RegisterClassMap();
csv.GetRecords().ToList().Dump();
}
}
公开课考试
{
公共int?OD_ID{get;set;}
公共字符串用户名{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
public int AttemptNo{get;set;}
公共日期时间尝试开始{get;set;}
公共日期时间尝试结束{get;set;}
公共int?SectionNo{get;set;}
public int QuestionNo{get;set;}
公共字符串QuestionType{get;set;}
公共字符串QuestionTitle{get;set;}
公共字符串Questiontext{get;set;}
公共字符串奖金{get;set;}
公共整数{get;set;}
公共字符串答案{get;set;}
公共字符串应答匹配{get;set;}
公共整数分数{get;set;}
公共int out{get;set;}
}
公共密封类ExamMap:CsvHelper.Configuration.CsvClassMap
{
公共ExamMap()
{
Map(m=>m.OD_ID).Name(“组织定义的ID”);
Map(m=>m.Username).Name(“Username”);
Map(m=>m.FirstName).Name(“FirstName”);
Map(m=>m.LastName).Name(“LastName”);
Map(m=>m.AttemptNo).Name(“尝试#”);
Map(m=>m.AttemptStart).Name(“尝试启动”);
Map(m=>m.AttemptEnd).Name(“尝试结束”);
Map(m=>m.SectionNo).Name(“Section#”);
Map(m=>m.QuestionNo).Name(“Q#”);
Map(m=>m.QuestionType).Name(“Q类型”);
地图(m=>m.QuestionTitle).Name(“Q标题”);
Map(m=>m.Questiontext).Name(“Q文本”);
Map(m=>m.Bonus).Name(“Bonus?”).TypeConverterOption(true,“true”).TypeConverterOption(false,“false”);
地图(m=>m.demobility).Name(“demobility”);
Map(m=>m.Answer).Name(“Answer”);
Map(m=>m.AnswerMatch).Name(“答案匹配”);
地图(m=>m.Score).Name(“Score”);
Map(m=>m.OutOf).Name(“OutOf”);
}
}

日期时间格式为MM/dd/yyyy HH:nn。应为“MM/dd/yyyy HH:MM,带MM,不带nn。这不会更改结果。即使将其更改为“M/d/yyyy HH:mm”也不起作用。您的变量显示您应该使用TryParseExact。也尝试了此操作,但结果相同:
DateTime.TryParse(r[“尝试启动”],out dateTimeValue)
。事实上,添加这个ConvertUsing会导致值被设置为null,在它们被设置为
1/1/0001 12:00:00 AM
之前,我将dateTimeValue定义更改为这个,这样我就不会得到null:
DateTime dateTimeValue=DateTime.Now
return DateTime value
您是对的,我修复了代码,根据您的示例成功解析了DateTime(请参阅)。奇怪的是,它甚至没有到达您的断点。您可以
.Ignore()
一些属性并检查第一个导致问题的属性吗?仍然不会在断点处停止。我甚至不确定它是否在使用地图,因为我将
.Ignore
添加到了除
尝试启动
之外的所有项目中,并获得了与其他项目相同的结果
csv.Configuration.RegisterClassMap<ExamMap>();
csv.GetRecords<Exam>().ToList().Dump();
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");
    }
}