2012-11-05 26 views
5

Próbuję policzyć liczbę słów z pliku tekstowego, a mianowicie to, aby rozpocząć.Zliczanie liczby słów w pliku tekstowym

To jest test programu liczenia słów. To tylko test. Jeśli Twój program działa poprawnie, powinieneś obliczyć, że w tym pliku jest 30 słów.

używam StreamReader umieścić wszystko z pliku na ciąg znaków, a następnie użyć metody .split aby uzyskać liczbę pojedynczych słów, ale wciąż otrzymuję złą wartość, gdy skompilować i uruchomić program.

using System; 
using System.IO; 

class WordCounter 
{ 
    static void Main() 
    { 
     string inFileName = null; 

     Console.WriteLine("Enter the name of the file to process:"); 
     inFileName = Console.ReadLine(); 

     StreamReader sr = new StreamReader(inFileName); 

     int counter = 0; 
     string delim = " ,."; 
     string[] fields = null; 
     string line = null; 

     while(!sr.EndOfStream) 
     { 
      line = sr.ReadLine(); 
     } 



     fields = line.Split(delim.ToCharArray()); 
     for(int i = 0; i < fields.Length; i++) 
     { 
      counter++; 
     } 
     sr.Close(); 
     Console.WriteLine("The word count is {0}", counter); 
    } 
} 
+1

przeciwieństwie do stron forum, nie używamy "Dzięki" lub "Każda pomoc mile widziane", czy podpisy na [tak]. Zobacz sekcję "[Powinieneś" Cześć "," dziękuję ", slogany i pozdrowienia z postów?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be - usunięto-z-postów). Zmieniłem również Twój tytuł. "Czy w tytułach powinny znajdować się" tagi "? (http://meta.stackexchange.com/questions/19190/)", gdzie konsensus jest "nie, nie powinien". –

Odpowiedz

1

Kilka wskazówek.

  1. Co, jeśli po prostu masz zdanie "cześć", jaki byłby twój wynik?
  2. Obliczanie licznika: od 0 do fields.Length, licznik inkrementów. Jak są fields.Length i twój licznik powiązany?
+0

1. Kiedy właśnie wstawiam "cześć" w pliku tekstowym, mówi mi, że liczba słów wynosi 1. – user1781027

2

ten powinien pracować dla Ciebie:

using System; 
using System.IO; 

class WordCounter 
{ 
static void Main() 
{ 
     string inFileName = null; 

     Console.WriteLine("Enter the name of the file to process:"); 
     inFileName = Console.ReadLine(); 

     StreamReader sr = new StreamReader(inFileName); 

     int counter = 0; 
     string delim = " ,."; //maybe some more delimiters like ?! and so on 
     string[] fields = null; 
     string line = null; 

     while(!sr.EndOfStream) 
     { 
     line = sr.ReadLine();//each time you read a line you should split it into the words 
     line.Trim(); 
     fields = line.Split(delim.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 
     counter+=fields.Length; //and just add how many of them there is 
     } 


     sr.Close(); 
     Console.WriteLine("The word count is {0}", counter); 
} 

}

+0

Dlaczego nie 'StreamReader.ReadToEnd()'? – neeKo

+0

@ NikoDrašković Co zrobić, jeśli plik ma 1000 lub 10000 lub 10 milionów słów? Odkąd zacząłem z C dawno temu, nigdy nie użyłbym ReadToEnd, to nawyk, ale myślę, że czytanie do pamięci czegoś, co jest w pliku w przypadkach, kiedy mogę czytanie go w porcjach nie jest najlepszą opcją, a to ilustruje błędy OP w kodzie –

+0

Twój kod zadziałał, ale nie rozumiem dlaczego. lds.Length, daje mi wartość 3. Jak to się dzieje, counter + = fields.Length daje 30, kiedy licznik został zainicjalizowany jako 0? – user1781027

0

pewnie dostaniem się jeden błąd, spróbuj coś takiego

counter = 0; 
    while(!sr.EndOfStream) 
    { 
     line = sr.ReadLine(); 
     fields = line.Split(delim.ToCharArray()); 
     counter += field.length(); 
    } 

nie ma potrzeby iteruj po tablicy, aby policzyć elementy, gdy możesz uzyskać numer bezpośrednio:

+0

W podanym mi pliku tekstowym akapit został ułożony na 3 linie, z ostatnią linią zawierającą tylko "w tym pliku". Kiedy wypróbowałem Console.WriteLine (linia); w moim programie bez niczego, po prostu wypisuje "w tym pliku." Czy wiesz, dlaczego właśnie przeczytałeś ostatnią linię? – user1781027

+0

ah, k srry Nie patrzyłem na to wystarczająco uważnie, ponieważ linia odczytu czyta tylko jedną linię na raz, więc czytasz wszystkie, ale tylko zliczając ostatnią czyta się –

+0

Zmieniłem kod tak, aby był teraz linia + = sr.ReadLine + ""; i teraz wyświetla cały ciąg, gdy wyświetlam ciąg w Console.WriteLine. Jednak daje mi wartość 35, gdy próbuję wyświetlić pola. Długość. Każdy pomysł, dlaczego? – user1781027

3

spróbuje użyć wyrażenia regularnego, np .:

var count = Regex.Matches(input, @"\b\w+\b").Count(); 
0
//Easy method using Linq to Count number of words in a text file 
/// www.techhowdy.com 
// Lyoid Lopes Centennial College 2018 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace FP_WK13 
{ 
    static class Util 
    { 

     public static IEnumerable<string> GetLines(string yourtextfile) 
     { 
      TextReader reader = new StreamReader(yourtextfile); 
      string result = string.Empty; 
      string line; 
      while ((line = reader.ReadLine()) != null) 
      { 
       yield return line; 
      } 
      reader.Close(); 
     } 



     // Word Count 

     public static int GetWordCount(string str) 
     {   
      int words = 0; 
      string s = string.Empty; 
      var lines = GetLines(str); 

      foreach (var item in lines) 
      { 
       s = item.ToString(); 
       words = words + s.Split(' ').Length; 

      } 

      return words; 

     } 


    } 
} 
+0

Nie wstawiaj tylko kodu. Dodaj opis, w jaki sposób otrzymałeś to rozwiązanie. – Lakmi

Powiązane problemy