我有这个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位数字)
感谢。
答案 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;
}
}