2013-05-05 112 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