0

[編集済み] わかりました。再構成させてください。numVol は 45で、ファイルの内容は

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

しかし、私はまだ問題を解決できません。これで543が返されます。したがって、numVolに等しいときにを返しますが、行の最初の番号のみをチェックします。


2 つの文字列を比較するのに問題があります。次の内容の .csv ファイルがあり54;a;b;c;de、そのnumVol値が 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;
}
4

1 に答える 1

2

問題は、区切り文字としてScanner使用するように指示したので、空白を区切り文字として使用しなくなったことです。したがって、テスト対象のトークンは isn'tであり、 (前の行の終わり、改行、および次の行の始まり) であり、一致しません。;"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 パース
結果 = 45

この問題に対する答えを見つける方法は、デバッガーを使用してコードをウォークスルーし、 の値を監視するlineか、(何らかの理由でデバッガーがない場合は?!)System.out.println("line = " + line);ステートメントをループに挿入して確認することでした。比較していたもの。たとえば、System.out.println("line = " + line);上記のline = scanner.next();行の上に a を挿入";"し、区切り文字としてのみ使用する場合:

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 パース
行 = [[54]]
行 = [[a]]
行 = [[23]]
行 = [[c]]
行 = [[de]]
行 = [[56
23]]
行 = [[d]]
行 = [[24]]
行 = [[c]]
行 = [[h]]
行 = [[456
45]]
行 = [[87]]
行 = [[c]]
行 = [[y]]
行 = [[535
432]]
行 = [[42]]
行 = [[h]]
行 = [[h]]
行 = [[543
]]
結果 = 543

...問題を視覚化するのに役立ちます。

于 2013-05-05T22:14:07.067 に答える