2017-10-11 5 views
0

私は、.csファイルをとり、ファイルを読み込み、最も頻繁な単語をファイルに返す小さなプロジェクトを作成しました。しかし、今では、最も一般的な単語がコンマであることを返します。 文字列を分割してコンマを無視する方法はありますか?コンマを無視して文字列を分割する方法C#?

例えば:

:私は、文字列を持っています。 ? AA、B CDEF cfed、ABEF ABEF ABEF、

、今では最も一般的な単語が「ABEF」であることを返し、それが(2回発生した第三ABEFをカウントしないプログラム、である1最後にコンマ)

別の例:。

、。 ? AAは、CDEF cfed、ABEF ABEF ABEF、A、B、

この権利は今「」最も一般的な単語がコンマであることを返し、それが3回発生したが、事はある - 私は私のプログラムを無視したいですカンマと単語だけに焦点を当てます。

namespace WindowsFormsApp8 
{ 
    public partial class Form1 : Form 
    { 
    public Form1() 
    { 
     InitializeComponent(); 
    } 


    private async void button1_Click(object sender, EventArgs e) 
    { 
     using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Text Documents |*.cs;*.txt", ValidateNames = true, Multiselect = false }) //openfiledialog (all .cs; all.txt) 
     { 
      if (ofd.ShowDialog() == DialogResult.OK) //if in file dialog a file gets selected 
      { 
       using (StreamReader sr = new StreamReader(ofd.FileName)) //text reader 
       { 
        richTextBox1.Text = await sr.ReadToEndAsync(); //reads the file and returns it into textbox 
       } 
      } 
     } 
    } 

    private void button2_Click(object sender, EventArgs e) 
    {   
     string[] userText = richTextBox1.Text.ToLower().Split(' '); 
     var frequencies = new Dictionary<string, int>(); // variable frequencies, dictionary with key string, value int. 
     string highestWord = null; //declare string highestword with starting value null. 
     int highestFreq = 0; //declare integer highestfreq with starting value zero. 

     foreach (string word in userText) //search words in our array userText that we declared at the beginning. 
     { 
      int freq; //declare integer freq. 
      frequencies.TryGetValue(word, out freq); //trygetvalue from dictionary key, out value. 
      freq += 1; //count it. 

      if (freq > highestFreq) 
      { 
       highestFreq = freq; 
       highestWord = word; 
      } 
      frequencies[word] = freq; //assign most frequent word in frequencies dictionary to freq 
     } 
     MessageBox.Show("the most occuring word is: " + highestWord + ", it occured " + highestFreq + " times"); //display data to messagebox. 
    } 
    } 
} 
+1

あなたのコードを教えてください。どのようにこれをやっているかによって、これは1行のコードまたは5行になる可能性があります。 – Amy

+0

残念ですが、コードが追加されました –

+2

FYI、 "//開始値がNULLの最上位の文字列を宣言してください"まったく価値がありません。次のコードからは、null値を持つ変数を宣言していることは明らかです。そのようなコメントはちょうど混乱です。 – Amy

答えて

6

スプリットに分割する文字の配列を取ることができます。スペースとコンマを分けることができます。その後、適切なStringSplitOption

string[] userText = richTextBox1.Text.ToLower().Split(new char[] { ' ', ','}, StringSplitOptions.RemoveEmptyEntries); 

で空のエントリを削除また、あなたは別のオプションをすることによって延長する分割を容易にするためである。この

var g = userText.GroupBy(x => x) 
       .Select(z => new 
       { word = z.Key, count = z.Count()}) 
       .ToList(); 
string mostUsed = g.OrderByDescending(x => x.count) 
        .Select(x => x.word) 
        .FirstOrDefault(); 
+0

あなたのソリューションをありがとう、私は問題につまずいたスペースとカンマが私が削除したい唯一のものではないと言うことができます - 私もすべての中括弧とドットと等号を削除する - 私はそれを行う 'string [] userText = richTextBox1.Text.ToLower()。Split(新しいchar [] {''、 '='、 '+'、 '}'、 '{'}、StringSplitOptions.RemoveEmptyEntries); 'それ文字列の中で最も頻繁に使用される単語としてコンマを再び使い始めます。 –

+0

問題を引き起こす文字列の例を挙げることができますか? – Steve

+0

これは、テキストボックスのコンマだけでした。しかし、それでも、目に見えないものが最も一般的な言葉であり、それが何であるかは分かりません。私が使用している文字列は.csファイルからですので、コメントセクションに文字制限がありますので、pastebinを使用します:https://pastebin.com/mVH3CEYb(これは最もよく使われる単語はで6回発生していますこの文字列 –

2

ようなコードで、単語の頻度を計算するのLINQを使用することができますより具体的には、正規表現を使用してRegex.Split

string input = ", . ? a a, b cdef cfed, abef abef abef, , ,"; 
    string[] result = Regex.Split(input, @"\w+"); 

チェックlive testingをここに。

?が有効な単語の場合、正規表現よりも@"\w+|\?"になる可能性があります。

私は、より強力で後の変更を容易に受け入れることができるので、分割方法が十分であっても、regexを使用することをお勧めします。

ボーナスとして、正規表現について学ぶのは良いことです。

関連する問題