比较csv文件中的行

时间:2016-04-01 14:54:02

标签: c# visual-studio csv

我有这个csv文件,它在顶行有一个答案键,所有学生都在下面的答案中如下:

First Name,Last Name,Student ID,Version,Score,1,2,3,4,5,6,7,8,9,10
Answer Key,,,p,75,j,c,g,c,g,d,f,a,j,c
Mark,Mueller,14697,p,35,j,c,f,c,d,f,a,j,c,j
Andruw ,Wittles,15674,p,75,a,c,d,f,h,g,a,d,j,d
Bob,Johnson,32423,p,36,d,a,j,i,d,a,b,c,j,d
John,Smith,12343,p,67,a,c,b,g,h,j,a,d,c,b

问题在于我找不到比较答案键和学生答案的好方法。如果你能帮我,也给学生的ID分数。 (名称后面的5位数字)

感谢。

2 个答案:

答案 0 :(得分:1)

这是一个有希望展示OO之美的答案:

public class TestAnswers
{
    public string FirstName, LastName, Version;
    public int StudentId, Score;
    public string[] Answers;

    public TestAnswers(string testAnswersString)
    {
        string[] elements = testAnswersString.Split(',');
        FirstName = elements[0];
        LastName = elements[1];
        int.TryParse(elements[2], out StudentId);
        Version = elements[3];
        int.TryParse(elements[4], out Score);
        Answers = elements.Skip(5).Take(elements.Length - 5).ToArray();
    }
}

public class Test
{
    const string AnswerKeyName = "Answer Key";
    public TestAnswers AnswerKey;
    public TestAnswers[] StudentAnswers;

    public Test(string testCsvPath)
    {
        var allTestAnswers = File.ReadAllLines(testCsvPath).Skip(1).Select(answers => new TestAnswers(answers));
        AnswerKey = allTestAnswers.Single(answers => answers.FirstName == AnswerKeyName);
        StudentAnswers = allTestAnswers.Where(answers => answers.FirstName != AnswerKeyName).ToArray();
    }
}

通过打破问题并创建一个可以担心一个人的答案的对象,然后另一个担心将所有这些答案整理到测试中的对象,它变得更易于管理。然后,您可以根据Test对象中的Answer Key查询Student答案集合,以计算出您需要的任何内容。

答案 1 :(得分:0)

此代码将遍历csv的每一行,并将值与第一行进行比较。注意第一个循环是如何从 i = 1 开始的,以避免检查第一行是否等于它自己。其余部分也进行了调整,以避免前3列,即姓氏,姓氏和学生。

string[] allText = System.IO.File.ReadAllLines(theCSV);
for (i = 1; i < allText.GetLength(0); i++)
{
    string[] lineText = allText[i].Split(",");
    bool[] trueOrFalse = new bool[lineText.GetLength(0) - 3];
    for (i2 = 3; i2 < lineText.GetLength(0); i2++)
    {
        trueOrFalse[i2] = lineText[i2] == allText[0].Split(",")[i2] ? true : false;
    }
}