2012-12-08 82 views
-1

我有一個數據庫,其中我有3列(ID,名稱,信息鏈接)。從數據庫和文本文件使用java內容匹配

我有ID名稱存儲在數據庫中。

我有一個文本文件,我有所有的信息鏈接刮。

信息鏈接的形式:http://someURL/**Name**.htm

現在我想做的是從數據庫中取了個名字,讀取鏈接的文本文件中的一行,發現如果鏈接(線)包含藥物名稱,將該鏈接放入記錄的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 Something Field Only值。

+2

現在你正在遍歷整數,但如果有人會改變你的代碼,並得到一個請求參數id,你將有SQL-Injcetion vuln,使用準備好的statemets。請。 – fatfredyy

+0

那麼這段代碼是建立我自己的數據庫,我沒有在任何必須在整個世界中可見的應用程序中使用這段代碼。所以我現在不認爲SQL注入是我需要考慮的。 –

+0

@fatfredyy另外我不認爲更新查詢可以使用PreparedStatement可以嗎? –

回答

1

您使用正則表達式來分割單詞。類似於

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

並迭代並檢查所有單詞而不是僅僅一個單詞。

0

好吧,這就是我會做的:遍歷你的名字和使用split()與空格作爲分隔符來獲取數組中的每個單詞。然後,對於每個鏈接,從最後一個短劃線獲取子串直到「.htm」(當然,取決於鏈接的設置方式,也可以跳過這一步)。然後,在該字符串上,檢查名稱數組中是否包含在鏈接中的每個項目。爲每個匹配計算一個整數值,並將其與鏈接一起保存,例如在一個數組中,HashMap等(或只是保持鏈接中最匹配的變量,如果你找到一個更高匹配的鏈接,你可以更新它)。最後,選擇最匹配的鏈接。

目前,如果我看到正確的,你已經分裂,但你只使用該數組的第一個值。

當然,這不是故障安全的,但它是我能想到的最好的。如果你想排除任何錯誤,你將不得不手動檢查結果。

相關問題