-1

3つの列(id、name、info_link)を持つデータベースがあります。

ID名前をデータベースに保存しています。

すべての情報リンクをスクレイプしたテキストファイルがあります。

情報リンクは次の形式です。http://someURL/**Name**.htm

データベースから名前を取得し、リンクのテキストファイルから行を読み取り、link(line)にその薬の名前が含まれているかどうかを確認し、そのリンクをレコードのinfo_link列に配置します。

これが私のコードです

BufferedReader reader = new BufferedReader(new FileReader("./Links.txt"));
BufferedWriter writer = new BufferedWriter(new FileWriter("./AddedLinks.txt"));
int id = 1;
//Creates a connection to the Database
connection = DriverManager.getConnection(DB_URL,DB_USER,DB_PASS);

statement = connection.createStatement();
for(id=1;id<=1153;)
{   
   query = statement.executeQuery("SELECT name FROM drug_list WHERE id = '"+id+"';");
   query.next();
   String name = query.getString(1);
   String words[] = name.split(" ");
   String Myvalue = reader.readLine();
   boolean Found = false;
   while(!Found)
      if(Myvalue.toLowerCase().contains(words[0].toLowerCase()))
      {
         Boolean f = false;
         System.out.println("Found"+name);
         update = connection.prepareStatement("UPDATE drug_list SET info_link = ? WHERE id = ?;");
         update.setString(1, Myvalue);
         update.setInt(2, id);
         f = update.execute();
         if(!f)
         {
            System.out.println("QSE");
            id++;
            writer.write(Myvalue);
            Found = true;
         }

      }
      else
      {
         System.out.println("Could Not Find"+name+"\n");
         id++;
         Found = false;
      }
}

シングルワードで処理する必要のあるコンテナリンクを一致させることができます。しかし、問題は

私は次のような薬の名前を持っています

  • アルブテロール(サルブタモール)
  • ドルゾラミド/チモロール

等..

そしてそれらの対応するリンクは次のようになります:

 - http://Somelink/**albuterol_salbutamol**.htm
 - http://Somelink/**dorzolamide_timolol**.htm

また、データベースには、テキストファイルに対応するリンクがない名前がいくつかあります。これらもスキップします。データベースには合計1153個の値があります。

また、私は次のようないくつかの薬の名前を持っています

  • カルシウム何か
  • カルシウム何か何か
  • カルシウムは何かではない

したがって、分割した単語[0]だけに一致する場合、これは問題を引き起こします。Calcium SomethingFieldOnlyのすべての値を更新するためです。

4

2 に答える 2

1

正規表現を使用して単語を分割します。何かのようなもの

String words[] = a.split("[/()]");

繰り返して、1つの単語だけでなくすべての単語をチェックします。

于 2012-12-08T09:16:49.373 に答える
0

これが私がすることです。名前を繰り返し、区切り文字としてスペースを指定してsplit()を使用し、配列内のすべての単語を取得します。次に、リンクごとに、最後のダッシュから「.htm」までの部分文字列を取得します(もちろん、リンクの設定方法によって異なります。この手順をスキップすることもできます)。次に、その文字列で、名前配列の各項目がリンクに含まれているかどうかを確認します。一致するたびに整数値をカウントし、リンクと一緒に保存します。たとえば、配列、HashMapなどに保存します(または、一致度の高いリンクが見つかった場合に更新できる変数に、一致数が最も多いリンクを保持します) 。最後に、最も一致するリンクを取得します。

現在、私がその権利を見れば、あなたはすでに分割していますが、あなたはその配列の最初の値だけを使用しています。

もちろん、それはフェイルセーフではありませんが、私が考えることができる最高のものです。エラーを除外したい場合は、とにかく結果を手動で確認する必要があります。

于 2012-12-08T09:03:26.853 に答える