2013-05-05 113 views
0

[EDITED]好吧,我明白了,讓我重新配置。 numVol是45和文件的內容是JAVA,比較兩個字符串

54;a;23;c;de;56 
23;d;24;c;h;456 
45;87;c;y;535 
432;42;h;h;543 

,但我仍然無法解決我的問題,這與它的回報543等什麼即時試圖做的是恢復當其平等numVol但只檢查一行的第一個數字。


我在比較兩個字符串時遇到了問題。假設我有一個包含以下內容的.csv文件:54;a;b;c;denumVol值爲54.該方法應該返回54,但由於某種原因,它不會輸入「if」並返回「de」。

public static String test(int numVol)throws Exception{ 
    File file = new File("test.csv"); 
    Scanner scanner = new Scanner(file); 
    scanner.useDelimiter(";"); 
    String line = ""; 
    String sNumVol = ""+numVol; //create a string with numVol value in it 
    while (scanner.hasNext()){ 
     line = scanner.next(); 
     if(line.equals(sNumVol)){ 
      scanner.close(); 
      return line; 
     } 
    } 
    scanner.close(); 
    return line; 
} 
+3

「ligne」是一個錯字,對不對?你的意思是將它分配給循環前初始化的「行」? – Scotch 2013-05-05 21:50:28

+1

是啊,我的壞它是一種類型。 ligne實際上是在法國線,我想取代所有的「ligne」線,所以你不能理解,但我錯過了1. – 2013-05-05 21:53:52

+2

適合我工作。看起來是這個文件。 – Marco 2013-05-05 21:58:11

回答

2

的問題是,既然你已經告訴Scanner使用;作爲分隔符,它使用空格作爲分隔符不再是。因此,對"45"進行測試的令牌不是"45",它是"456\n45"(上一行的末尾,換行符和下一行的開頭),這不匹配。

更改useDelimiter線使用分號和空格作爲分隔符的:

scanner.useDelimiter("[;\\s]"); 

...然後掃描儀看到"456""45"分開,以及相匹配的"45"

此代碼:

import java.util.*; 
import java.io.*; 

public class Parse { 
    public static final void main(String[] args) { 
     try { 
      String result = test(45); 
      System.out.println("result = " + result); 
     } 
     catch (Exception e) { 
      System.out.println("Exception"); 
     } 
    } 

    public static String test(int numVol)throws Exception{ 
     File file = new File("test.csv"); 
     Scanner scanner = new Scanner(file); 
     scanner.useDelimiter("[;\\s]"); // <==== Change is here 
     String line = ""; 
     String sNumVol = ""+numVol; 
     while (scanner.hasNext()){ 
      line = scanner.next(); 
      if(line.equals(sNumVol)){ 
       scanner.close(); 
       return line; 
      } 
     } 
     scanner.close(); 
     return line; 
    } 
} 

有了這個test.csv

54;a;23;c;de;56 
23;d;24;c;h;456 
45;87;c;y;535 
432;42;h;h;543

顯示此:

$ java Parse 
result = 45

找到答案,這個問題的方法是簡單地遍歷代碼w使用調試器並觀察line的值,或者(如果由於某種原因,您沒有調試器?!),則在循環中插入System.out.println("line = " + line);語句以查看正在比較的內容。舉例來說,如果你插入一個System.out.println("line = " + line);上述line = scanner.next();線之上,你只需要使用";"作爲分隔符:

import java.util.*; 
import java.io.*; 

public class Parse { 
    public static final void main(String[] args) { 
     try { 
      String result = test(45); 
      System.out.println("result = " + result); 
     } 
     catch (Exception e) { 
      System.out.println("Exception"); 
     } 
    } 

    public static String test(int numVol)throws Exception{ 
     File file = new File("test.csv"); 
     Scanner scanner = new Scanner(file); 
     scanner.useDelimiter(";"); // <== Just using ";" 
     String line = ""; 
     String sNumVol = ""+numVol; 
     while (scanner.hasNext()){ 
      line = scanner.next(); 
      System.out.println("line = [[" + line + "]]"); 
      if(line.equals(sNumVol)){ 
       scanner.close(); 
       return line; 
      } 
     } 
     scanner.close(); 
     return line; 
    } 
} 

你看這個:

$ java Parse 
line = [[54]] 
line = [[a]] 
line = [[23]] 
line = [[c]] 
line = [[de]] 
line = [[56 
23]] 
line = [[d]] 
line = [[24]] 
line = [[c]] 
line = [[h]] 
line = [[456 
45]] 
line = [[87]] 
line = [[c]] 
line = [[y]] 
line = [[535 
432]] 
line = [[42]] 
line = [[h]] 
line = [[h]] 
line = [[543 
]] 
result = 543

...這有助於可視化的問題。

+0

非常感謝你,在Varun Madiath和Marco告訴我代碼正常工作之後,我確實找到了答案,但我仍然不知道要添加到分隔符以使其工作,即時編碼真的很新。我現在需要的只是讓它只檢查一行的第一個數字。謝謝 – 2013-05-05 22:27:37

+0

@BobJ:不客氣!我們都是新手,並且(它的價值)這是非顯而易見的,人類大腦自然分解了這些CSV行,並且自己看到了'45',儘管代碼(自然地)不會。這裏的關鍵是通過調試器遍歷它並查看代碼正在看到什麼。經常這樣做會讓事情變得明顯,這是驚人的。 Netbeans,Eclipse,IntelliJ IDEA,甚至只是JSwat,他們都讓我們一步一步地瀏覽代碼。 – 2013-05-05 22:30:58