2016-11-24 5 views
-1

gezählt werden Ich versuche, eine Textdatei zu lesen und zählen, wie oft eine bestimmte Zeichenfolge angezeigt wird. Das ist, was ich habe, so weit:Wie die Anzahl der Unterzeichenfolgen in Zeichenfolge

System.IO.StreamReader file = new System.IO.StreamReader("C:\\Users\\Test\\Documents\\Sample.txt"); 
while ((line = file.ReadLine()) != null) { 
    Console.WriteLine(line); 

    counter = Regex.Matches(line, "the", RegexOptions.IgnoreCase).Count; 
} 

Console.WriteLine(counter); 

file.Close(); 

// Suspend the screen. 
Console.ReadLine(); 

Deshalb möchte ich alle Wörter finden, die die Zeichenfolge „die“ in ihnen enthalten, aber ich habe nicht die richtige Anzahl bekommen. Ich will, dass es auch das "Das" wie das Wort "verwelkt" usw. zählt und nicht nur das Wort "das". Das Problem, das ich fand, ist, dass, wenn die TXT-Datei verschiedene Absätze und Leerzeichen zwischen ihnen enthält, es die Wörter vermisst. Wenn ich zwischen den Absätzen keinen Abstand einstelle, scheint es zu funktionieren. Was kann ich tun, um das Problem zu beheben?

Dies ist, was ich von Absatz Räume bedeuten:

Sample text Sample text Sample text Sample text Sample text. 

Sample text Sample text Sample text Sample text Sample text . 

Aber wenn ich sie so kombinieren es funktioniert:

Sample text Sample text Sample text Sample text Sample text.Sample text Sample text Sample text Sample text Sample text. 
+2

Jede Schleife wird die Anzahl festlegen. Sie möchten die Anzahl erhöhen. 'counter + = ....' – Nkosi

Antwort

1

Wenn Sie die Anzahl für jede Zeile angezeigt werden soll, bedeutet müssen Sie verschiebe die Console.WriteLine(counter); an die Grenzen von while.

string searchStr= "the"; 
while ((line = file.ReadLine()) != null) 
{ 
    Console.WriteLine(line); 
    counter = Regex.Matches(line,searchStr, RegexOptions.IgnoreCase).Count; 
    Console.WriteLine("Count of {0} in this line is {1}",searchStr,counter); 
} 

oder sonst können Sie die vollständige Zählung des Suchwortes angezeigt, wenn die counter in jeder Iteration des während aktualisieren.

string searchStr= "the"; 
while ((line = file.ReadLine()) != null) 
{ 
    Console.WriteLine(line); 
    counter += Regex.Matches(line, searchStr , RegexOptions.IgnoreCase).Count; 
} 
Console.WriteLine("Occurance of {0} in this document is {1}",searchStr,counter); 

Updates: Um alle Wörter zu erhalten, die bestimmte Wörter enthält und die Gesamtzahl der Vorkommen des Suchbegriffs in der gegebenen Inhalt zählen Sie die Verwendung einer Liste wie folgt machen:

string searchStr= "the"; 
List<string> totalMatchStrings = new List<string>(); 
while ((line = file.ReadLine()) != null) 
{ 
    totalMatchStrings.AddRange(lineInput.Split(' ').Where(x => x.ToLower().Contains(searchString)));   
} 
string matchingWords = String.Join(",", totalMatchStrings.Distinct()); 
Console.WriteLine("Occurance of {0} in this document is {1}",searchStr,totalMatchStrings.Count); 
Console.WriteLine("matching words are : {0}",matchingWords); 
+0

Ah danke! Das hat es behoben –

+0

Froh zu hören, dass es geholfen hat. Immer glücklich, dir zu helfen .......! –

+0

Wie kann ich alle diese Zeichenfolgen speichern, die das Wort "the" in einem Array enthalten? –

2

Sie müssen Zahl erhöhen, anstatt sie jedes Mal der Einstellung

System.IO.StreamReader file = new System.IO.StreamReader("C:\\Users\\Test\\Documents\\Sample.txt"); 
while ((line = file.ReadLine()) != null) 
{ 
    Console.WriteLine(line); 
    //increment count instead of setting it everytime 
    counter += Regex.Matches(line, "the", RegexOptions.IgnoreCase).Count; 
} 
Console.WriteLine(counter); 
file.Close(); 
// Suspend the screen. 
Console.ReadLine(); 
+0

Ich glaube nicht, dass diese Regex wird ausreichen. Wenn ein einzelnes Wort _the_ zweimal enthält, wird es zweimal gezählt. Vielleicht [\ b. *? Der. *? \ B] (http://regexstorm.net/tester?p=%5cb.*%3fthe.*%3f%5cb&i=hello%0d%0ahethello%0d%0ahetheltelo) ist eine Regex, die funktionieren kann. –

0

Wenn Sie .NET 3.5 verwenden Sie können dies mit LINQ in einem Einzeiler tun:

int count = line.Count(f => f == 'the'); 
1
var allLines = File.ReadAllLines(@"C:\POC\input.txt"); 
var theCount = allLines.SelectMany(l => l.Split(' ')) 
     .Where(l => l.ToLower().Contains("the")) 
     .Count(); 
+0

@Verarind: https://msdn.microsoft.com/en-us/library/s2tte0y1(v=vs.110).aspx 'ReadAlllines' Methode kümmert sich darum. – DarkKnight

+0

Oh - ja. Miss den Code gelesen. Ich lese 'ReadAllText'. Entschuldigung, das war mein Fehler. –

0

Sie folgenden Code innerhalb der Schleife, wenn Zeile für Zeile lesen können und Zählung Zeile für Zeile hinzufügen.

Regex.Matches(Regex.Escape(input), "the", RegexOptions.IgnoreCase).Count 
Verwandte Themen