2016-04-01 4 views
-2

ich diese CSV-Datei habe, die wie so einen Antwortschlüssel in der oberen Reihe und alle Schüler Antworten darunter in einer Rolle hat:Vergleich Linien auf CSV-Datei

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 

Das Problem ist, dass ich nicht finden kann, eine gute Möglichkeit, den Antwortschlüssel und die Antworten der Schüler zu vergleichen. Wenn Sie mir helfen könnten, geben Sie auch die ID des Studenten die Punktzahl. (Die 5-stellige Nummer nach dem Namen)

Danke.

+0

Erstellen Sie eine Klasse für die Schüler, laden Sie die Antworten in ein Array und vergleichen Sie dieses Array mit einem Antwortschlüssel-Array. Jeder Student hat seine eigene Instanz, so dass alle Daten korrekt zugeordnet sind und Sie können alle Ihre Schüler für den von Ihnen gewünschten Zweck durchlaufen –

+2

Bitte beachten Sie, dass diese Seite kein Code-Schreibdienst ist. Wenn Sie Ihre Frage bearbeiten, um zu beschreiben, was Sie so weit versucht und wo Sie stecken bleiben, dann können wir versuchen, mit spezifischen Problemen zu helfen. Sie sollten auch [fragen] lesen. –

+0

Es gibt viele CSV-Parser wie [dieser CsvHelper] (https://www.nuget.org/packages/CsvHelper/). Keine Notwendigkeit, das Rad neu zu erfinden, wenn generische Probleme gelöst werden, es sei denn, dies ist für die Schule und Ihr Lehrer fordert Sie auf, Ihren eigenen Code zu schreiben. – Igor

Antwort

0

Dieser Code wird durch jede Zeile des csv durchlaufen und die Werte mit der ersten Zeile vergleichen. Beachten Sie, wie die erste Schleife miti = 1beginnt, um zu vermeiden, zu überprüfen, ob die erste Zeile gleich ist. Der Rest wurde ebenfalls angepasst, um die ersten drei Spalten zu vermeiden, die Vorname, Nachname und Student sind.

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; 
    } 
} 
+0

Zeichenketten durch Komma trennen, um CSV zu analysieren? Ernst? – Neolisk

+0

Ich sehe das Problem damit nicht, funktioniert es nicht? –

+0

It ** only ** funktioniert, wenn Sie sehr viel Glück mit der CSV-Datei haben. Wenn Sie innerhalb von Werten Kommas oder Zeilenumbrüche einfügen, wird Ihr Code nutzlos. Es gibt qualitativ hochwertige, leistungsstarke CSV-Parser aus einem bestimmten Grund da draußen. Beispiel: https://github.com/kentcb/KBCsv – Neolisk

1

Dies ist eine Antwort, die die Schönheit von OO hoffentlich zeigt:

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(); 
    } 
} 

das Problem nach unten und die Schaffung eines Objekts durch brechen, die über eine Person antwortet und dann ein anderes Objekt kümmern kann, die über Sortier Sorgen alle diese Antworten in einen Test, wird es viel leichter zu handhaben. Sie können dann die Sammlung der Schülerantworten anhand des Antwortschlüssels im Testobjekt abfragen, um herauszufinden, was Sie benötigen.

+0

@Neolisk Obwohl die Idee ist schön, keine Notwendigkeit, nett zu sein, in Ihren Worten "* Splitting Strings per Komma CSV zu analysieren? Ernsthaft? *" –

+0

@ Neolisk Was Sie vermissen ist, dass diese Antwort im Wesentlichen die gleiche ist wie meins, ist es sogar sehr spezifisch für die Frage, dass es unwahrscheinlich ist, anderen zu helfen, schließlich ist StackOverflow * indexiert von Suchmaschinen –

+0

@Neolisk Ich kann es viel spezifischer machen, wenn Sie bevorzugen, damit Ihre Punkte besser kommen? –