1

わかりましたので、.txtファイルを読み取って、個別の単語を数えることができるC#コンソールアプリがあります..そしてそれは機能します..しかし、ファイル内のすべての個別の単語を100MBで読み取りますファイルは何日もかかります..私が望むのは、ファイルを一度読んで、すべての異なる単語を数えることです。これまでのアプリの一部を次に示します。

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Diagnostics;
using System.Data;
using System.IO.MemoryMappedFiles;

namespace CompressionApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //read all text
            string FilePath = (@"D:\Test\testing.txt");
            string FullText;
            using (StreamReader streamReader = new StreamReader(FilePath))
            {
                FullText = streamReader.ReadToEnd();
            }
            FileInfo Info = new FileInfo(FilePath);
            int FileSize = Convert.ToInt32(Info.Length);
//some code

            string[] Words = FullText.Split(' ');

            var DistinctWords = new List<string>(Words.Distinct());

//some code

            int P = 0;
            int ID = 0;
            int Length = 0;
            int ByteWorth;
            double Perc;
            double PPerc = 0;
            bool display = false;

            using (var mappedFile1 = MemoryMappedFile.CreateFromFile(FilePath))
            {
                using (Stream mmStream = mappedFile1.CreateViewStream())
                {
                    using (StreamReader sr = new StreamReader(mmStream, ASCIIEncoding.ASCII))
                    {
                        Parallel.ForEach(DistinctWords, new ParallelOptions { MaxDegreeOfParallelism = 1 }, Word =>
                        {
                            DataRow dr = dt.NewRow();
                            string SearchTerm = Word;
                            var MatchQuery = from word in Words
                                             where word == SearchTerm
                                             select word;

                            int WordCount = MatchQuery.Count();
                            Length = SearchTerm.Length;
                            if (Length > 1)
                            {
                                if (WordCount > 1)
                                {
                                    ID = ID + 1;
                                    ByteWorth = (Length * 8) * WordCount;
                                    dr["Word"] = SearchTerm;
                                    dr["Count"] = WordCount;
                                    dr["ID"] = ID;
                                    dr["Length"] = Length;
                                    dr["ByteWorth"] = ByteWorth;
                                    dt.Rows.Add(dr);
                                }
                            }
//some code below

これはこれまでのところ完全なアプリです...あまりきれいではありません。しかし、私はコーディングが初めてです。

ヒント、ヒント、提案は大歓迎です。

4

2 に答える 2

2

私が理解しているように、個別の単語を取得してから、各単語についてファイル全体を調べて、その単語の出現回数を数えます。私の予想では、明確な単語を見つけるのにほとんど時間がかからないと思いますが、出現回数をカウントするループはほぼ永遠にかかります。

LINQ を使用して、個別の単語とそのカウントを取得できます。次のコード行を置き換えます。

var DistinctWords = new List<string>(Words.Distinct());

var DistinctWithCount = from word in Words
                        group word by word
                        into g
                        select new {Word = g.Key, Count = g.Count()};

次に、次のようなカウントで単語を列挙できます。

foreach (var g in DistinctWithCount)
{
    Console.WriteLine("{0},{1}", g.Word, g.Count);
}
于 2013-06-19T14:57:19.277 に答える