C# :: Aufgabe #156 :: Lösung #2
3 Lösungen
#156
Wörterzählen in Textdateien
Anfänger - C#
von hollst
- 23.12.2016 um 09:50 Uhr
Man schreibe ein Programm, das bei einer beliebigen Textdatei (ASCII)
a) alle Wörter und
b) alle unterschiedlichen Wörter der Längen 1, 2, 3 ... zählt, wobei zwischen Groß- und Kleinbuchstaben nicht zu unterscheiden sei.
Als Wörter-Trennzeichen sind zu verwenden:
a) alle Sonderzeichen (' ', '.', ',', tab ...) sowie Zahlen (0, 1 ... 9) und
b) alle Chars, die nicht zum Aphabet (abc...xyzäöü) gehören (damit wäre a) bereits automatisch erfüllt).
Anmerkungen:
a) Es gibt auch im Deutschen Wörter der Länge 1, z. B. in "a tempo" oder " a priori" oder bei Abkürzungen ("z. B.").
b) Als Beispieltext kann von hier die komplette Bibelausgabe nach Martin Luther 1912 als ASCII-Datei heruntergeladen und verwendet werden (ist mit 4 MB zu lang als Anhang hier, selbst als *.rar noch ca. 1.2 MB).
Viel Spaß und schöne Weihnachten sowie einen guten Rutsch und Start in 2017.
a) alle Wörter und
b) alle unterschiedlichen Wörter der Längen 1, 2, 3 ... zählt, wobei zwischen Groß- und Kleinbuchstaben nicht zu unterscheiden sei.
Als Wörter-Trennzeichen sind zu verwenden:
a) alle Sonderzeichen (' ', '.', ',', tab ...) sowie Zahlen (0, 1 ... 9) und
b) alle Chars, die nicht zum Aphabet (abc...xyzäöü) gehören (damit wäre a) bereits automatisch erfüllt).
Anmerkungen:
a) Es gibt auch im Deutschen Wörter der Länge 1, z. B. in "a tempo" oder " a priori" oder bei Abkürzungen ("z. B.").
b) Als Beispieltext kann von hier die komplette Bibelausgabe nach Martin Luther 1912 als ASCII-Datei heruntergeladen und verwendet werden (ist mit 4 MB zu lang als Anhang hier, selbst als *.rar noch ca. 1.2 MB).
Viel Spaß und schöne Weihnachten sowie einen guten Rutsch und Start in 2017.
#2
von daniel59 (4260 Punkte)
- 04.01.2017 um 10:14 Uhr
Program.cs
C#-Code
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Word = Microsoft.Office.Interop.Word;
namespace ConsoleCountWords
{
static class Program
{
const string allChars = "abcdefghijklmnopqrstuvwxyzäöüß";
[STAThread]
static void Main(string[] args)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Textdateien (*.txt)|*.txt";
if (ofd.ShowDialog() == DialogResult.OK)
{
string file = ofd.FileName;
string text = File.ReadAllText(file, Encoding.ASCII);
object missing = System.Reflection.Missing.Value;
Word.Application app = new Word.Application();
Word.Document document = app.Documents.Add(ref missing, ref missing, ref missing, ref missing);
document.Content.SetRange(0, 0);
document.Content.Text = text;
Dictionary<int, int> wordLength;
int count = document.CountWords(out wordLength);
if (count == 1)
{ Console.WriteLine("1 Wort gezählt"); }
else
{ Console.WriteLine("{0} Wörter gezählt", count); }
foreach (var item in wordLength.OrderBy(a => a.Key))
{
if (item.Value == 1)
{
Console.WriteLine("1 Wort der Länge {0} gezählt", item.Key);
}
else
{
Console.WriteLine("{0} Wörter der Länge {1} gezählt", item.Value, item.Key);
}
}
document.Close(Word.WdSaveOptions.wdDoNotSaveChanges);
app.Quit();
Console.ReadLine();
}
}
static int CountWords(this Word.Document doc, out Dictionary<int, int> wordLength)
{
int c = 0;
wordLength = new Dictionary<int, int>();
for (int i = 1; i <= doc.Words.Count; i++)
{
string word = doc.Words[i].Text.ToLower();
if (!allChars.Contains(word.Last()))
{ word = word.Substring(0, word.Length - 1); }
if (word.All(a => allChars.Contains(a)) && word.Length > 0)
{
c++;
if (wordLength.ContainsKey(word.Length))
{ wordLength[word.Length]++; }
else
{
wordLength.Add(word.Length, 1);
}
}
}
return c;
}
}
}
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1
