0

さまざまな種類のデータのファイルを読み取るプログラムを作成しています。ファイルから作成したさまざまな配列にデータを渡そうとしています。

ファイルのサンプル部分 (改行のためダブルスペース。カテゴリ間の空白はタブ、姓名と国の間の空白はスペース)

Name Age    Country Year    Closing Date    Sport   Gold    Silver  Bronze  Total

Joe Max 24  Algeria 2012    8/12/2012   Athletics   1   0   0   1

Tom Lan 27  United States   2008    8/24/2008   Rowing  0   1   0   1

しかし、コードをコンパイルすると、InputMismatchException が発生します。各行の終わりに続くタブがないという事実を扱っているかどうか疑問に思っています。誰でもこれで私を助けることができますか?

public static void main(String[] args) {
Scanner console = new Scanner(System.in);
intro();

Scanner input1 = null;
Scanner input2 = null;
int lineCount = 0;

try {
    input1 = new Scanner(new File("olympicstest.txt"));

} 
catch (FileNotFoundException e) {
    System.out.println("Invalid Option");
    System.exit(1);
}

while (input1.hasNextLine()) {
    lineCount++;
    input1.nextLine();
}

lineCount = lineCount - 1;

String[] country = new String[lineCount];
int[] totalMedals = new int[lineCount];
String[] name = new String[lineCount];
int[] age = new int[lineCount];
int[] year = new int[lineCount];
String[] sport = new String[lineCount];

try {
    input2 = new Scanner(new File("olympicstest.txt"));
    input2.useDelimiter("\t");  
} 
catch (FileNotFoundException e) {
    System.out.println("Invalid Option");  // not sure if this line is needed
    System.exit(1);  // not sure if this line is needed
}        

String lineDiscard = input2.nextLine();
for (int i = 0; i < lineCount; i++) {
    name[i] = input2.next();
    age[i] = input2.nextInt();
    country[i] = input2.next();
    year[i] = input2.nextInt();
    input2.next();  // closing ceremony date
    sport[i] = input2.next(); 
    input2.nextInt();  // gold medals
    input2.nextInt();  // silver medals
    input2.nextInt();  // bronze medals
    totalMedals[i] = input2.nextInt();
}

}
4

2 に答える 2

1

はい、特定の区切り文字を設定すると、残念ながらそれが値を区切るために使用される唯一の区切り文字になり、ステートメントでうまく機能しないため、各行の末尾に.next()タブ ( ) を追加するか、両方を設定して区切り文字にすることができます正規表現で。また、CSV 形式を使用し、すべての値をコンマで区切ることを好みます。これは、タブと空白文字は視覚的な観点からはあまり区別できないことが多いため、後で使用/フォーマットするのが簡単であることがわかったからです。\t\t\n"[\t\n]"

于 2014-04-01T19:01:45.347 に答える
1

はい、あなたは問題の原因について正しいです。useDelimiter解決策は、タブと改行の両方を受け入れる呼び出しで正規表現を使用することです。したがって、次のようにします。

input2.useDelimiter("[\t\n]");

正規表現の説明

于 2014-04-01T18:54:20.613 に答える