2016-03-19 4 views
0

Ich benutze C#, um eine CSV-Datei zu lesen und alle Wörter in neuen Zeilen auszuspucken. Dann möchte ich zählen, wie oft jedes Wort in dieser Datei in der Liste wiederholt wurde. Die Ausgabe, die ich bekomme, zählt die Wörter nicht. finden Sie die folgenden InformationenAus einer Datei lesen und die Wörter in einer Liste zählen

CSV-Datei Inhalt: Sie ist schön er schön sein kann oh wow das ist toll

Dies ist der Code:

using System; 
using System.IO; 
using System.Linq; 
using System.Collections.Generic; 

class Program 
{ 
    static void Main() 
    { 
     var list = File.ReadAllLines("Try3.csv"); 
     foreach (string line in File.ReadAllLines("Try3.csv")) 

     { 
      string[] parts = line.Split(' '); 
      foreach (string part in parts) 
      { 

       var q = list.GroupBy(x => x) 
        .Select(g => new {Value = g.Key, Count = g.Count()}) 
        .OrderByDescending(x=>x.Count); 
       foreach (var x in q){ 
       Console.WriteLine("{0}",part+" Count:"+ x.Count); 
     } 


    } 
    } 
    } 
    } 

Dies ist die Ausgabe Ich habe :

[output]

Jede Idee, bitte?

+2

Dies ist eine großartige Möglichkeit zu lernen, [wie einen Debugger verwenden] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Für den Anfang, warum teilen Sie die Zeichenfolge in Wörter und führen Sie dann eine Gruppierungsoperation für jedes Wort? –

+2

Ich hasse es pedantisch zu sein, aber das ist keine CSV-Datei, es ist einfacher Text. :) – CodingGorilla

Antwort

1

diesen

var results = File.ReadLines("Try3.cvs") 
        .SelectMany(line => line.Split(' ')) 
        .GrooupBy(word => word) 
        .ToDictionary(g => g.Key, g => g.Count()); 

First Try File.ReadLines verwendet, wird nur bedeuten, die Sie in einer Zeile zu einem Zeitpunkt zu lesen, anstatt die gesamte Datei in dem Speicher vor der Verarbeitung zu laden. Dies kann hilfreich sein, wenn die Dateigröße groß ist. Dann ist es nur eine einfache Angelegenheit, die Zeilen in Wörter aufzuteilen und diese Wörter dann zu gruppieren, um ein Wörterbuch zu erstellen, in dem die Wörter am Schlüssel und die Anzahl der Male in der Datei als Wert erscheinen.

Um die Ergebnisse in der Reihenfolge der Anzahl zu erhalten, können Sie stattdessen die folgenden Schritte ausführen.

var results = File.ReadLines("Try3.cvs") 
        .SelectMany(line => line.Split(' ')) 
        .GrooupBy(word => word) 
        .OrderByDescending(g => g.Count()) 
        .Select(g => new { Word = g.Key, Count = g.Count() }) 
        .ToList(); 
+0

Dies scheint mit seinem Code identisch zu sein, außer dass Sie ein 'Dictionary ' anstelle eines anonymen Objekts verwendet haben? Und du hast die Bestellung weggelassen. – CodingGorilla

+0

@CodingGorilla Gut für Anfänger liest dies nicht die gesamte Datei zweimal. Es wird auch tatsächlich zu einem Schlüssel-Wert-Paar von Wort und Anzahl führen. – juharr

+0

Nein, du hast Recht, der Schlüssel hier ist, dass du die unnötige 'foreach' auf den' Teilen' weggenommen hast, sorry, ich musste seinen Code ein paar Mal neu lesen. :) – CodingGorilla

Verwandte Themen