0

csv ファイルを読み取る必要があるプログラムを作成しています。そして、各行の最初の単語と、その直後に続く最初の数字を出力します。奇妙なことに、私のコードは友人のコンピューターでは機能しますが、自分のコンピューターでは機能しません。

メソッドと変数の命名法を英語に編集すると (読みやすいように)、さらに奇妙なエラーが発生しましたが、Netbeans では見つけられません。動作時の外観の簡単な例は次のとおりです。 Binnenstad 17.460 Bloemekenswijk 8.848 Brugse Poort - Rooigem 17.652 ...

メインクラスコード:

package autobezit;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Autobezit {

    /**
     * @param args the command line arguments
     * @throws java.io.FileNotFoundException
     */
    public static void main(String[] args) throws FileNotFoundException {
        Hood brugge = new Hood("brugge", 50000);
        System.out.println(brugge.getInfo());

        Autobezit situation = new Autobezit();
        situation.initialise();
    }

    public void initialise() throws FileNotFoundException {
        Scanner sc = new Scanner(new File("Gent_autobezit.csv"));
        sc.useDelimiter(";");
        for (int i=0; i<3; i++){
            sc.nextLine();
        }
        while(sc.hasNext()){
            String name= sc.next();
            int number= sc.nextInt();
            Hood hood = new Hood(name,number);
            sc.nextLine();
            System.out.print(hood.getInfo());
        }        
    }
}

そして「フードクラスコード」

package autobezit;

public class Hood {
    private String name;
    private int numberOfInhabitants;

    public Hood(String name, int numberOfInhabitants){
        this.name=name;
        this.numberOfInhabitants=numberOfInhabitants;
    }

    public String getInfo(){
        return name+" "+numberOfInhabitants;
    }
}

読み取る必要がある csv ファイル:

Gent in Cijfers;;;;;;;;;
Wijken;;;;;;;;;
;Totaal aantal inwoners (2010) [aantal];Aantal huishoudens zonder auto (2001) [huishoudens];Aantal huishoudens met 1 auto (2001) [huishoudens];Aantal huishoudens met 2 auto's (2001) [huishoudens];Aantal huishoudens met 3 of meer auto's (2001) [huishoudens];Percentage huishoudens zonder auto (2001) [huishoudens];Percentage huishoudens met 1 auto (2001) [huishoudens];Percentage huishoudens met 2 auto's (2001) [huishoudens];Percentage huishoudens met 3 of meer auto's (2001) [huishoudens]
Binnenstad;17.460;3.347;4.270;730;64;39,8;50,8;8,7;0,8
Bloemekenswijk;8.848;1.337;1.707;245;20;40,4;51,6;7,4;0,6
Brugse Poort - Rooigem;17.652;2.602;3.428;484;34;39,7;52,4;7,4;0,5
Dampoort;12.030;1.376;2.117;389;30;35,2;54,1;9,9;0,8
Drongen;12.946;520;2.571;1.514;170;10,9;53,8;31,7;3,6
Elisabethbegijnhof - Papegaai;7.086;1.217;1.669;342;24;37,4;51,3;10,5;0,7
Gentbrugge;7.407;596;1.681;598;65;20,3;57,2;20,3;2,2
Kanaaldorpen en -zone;2.438;353;782;247;27;25,1;55,5;17,5;1,9
Ledeberg;9.361;1.351;1.908;262;27;38,1;53,8;7,4;0,8
Macharius - Heirnis;6.695;973;1.253;233;16;39,3;50,6;9,4;0,6
Mariakerke;13.297;858;2.993;1.159;120;16,7;58,3;22,6;2,3
Moscou - Vogelhoek;4.993;508;1.198;294;27;25,1;59,1;14,5;1,3
Muide - Meulestede - Afrikalaan;6.010;806;1.095;133;18;39,3;53,4;6,5;0,9
Nieuw Gent - UZ;8.137;1.554;1.658;231;32;44,7;47,7;6,6;0,9
Oostakker;12.983;691;2.494;1.041;114;15,9;57,5;24;2,6
Oud Gentbrugge;8.431;914;1.900;378;38;28,3;58,8;11,7;1,2
Rabot - Blaisantvest;8.254;1.544;1.327;131;9;51,3;44,1;4,4;0,3
Sint Amandsberg;18.108;1.675;3.956;1.144;99;24,4;57,6;16,6;1,4
Sint Denijs Westrem;5.975;344;1.202;675;97;14,8;51,9;29,1;4,2
Sluizeken - Tolhuis - Ham;10.952;1.575;1.727;209;17;44,6;49;5,9;0,5
Stationsbuurt Noord;11.538;1.856;3.173;615;48;32,6;55,7;10,8;0,8
Stationsbuurt Zuid;7.745;875;1.918;494;56;26,2;57,4;14,8;1,7
Watersportbaan - Ekkergem;7.147;1.637;1.791;244;24;44,3;48,5;6,6;0,6
Wondelgem;14.126;989;3.474;966;68;18;63,2;17,6;1,2
Zwijnaarde;7.100;419;1.521;678;91;15,5;56,1;25;3,4
Totaal;246.719;29.917;52.813;13.436;1.335;30,7;54,2;13,8;1,4
;;;;;;;;;
 ;;;;;;;;;
 ;;;;;;;;;
 ;;;;;;;;;

編集: importcommand の追加:

import java.util.Locale;

// そして sc.useLocale.... sc.useDelimiter の直後

sc.useLocale(Locale.GERMAN);

いくつかの問題を解決しました。問題の最大の原因は次のとおりです。

while(sc.hasNext())
4

1 に答える 1

0

パソコンの症状は?私はコードを見ていますが、次の点は驚くべきものです。

  • 最初の 3 行 (sc.nextLine()) を破棄しますが、ファイルに提供する 3 行があるかどうかを確認していないようです。あなたとあなたの友人は同じ CSV を使用していますか?
  • CSV ファイルに不正な入力が含まれていますが、それを考慮していません。

これは数値形式の問題であり、ファイルに浮動小数点数が含まれているためではなく、おそらくファイルにヨーロッパ形式の数値が含まれているためだと思います (つまり、17.460 は実際には 17460 です)。友人のコンピューターでおそらく動作する理由は、彼らが米国を使用しているためです。ロケールであり、数値は「17460」ではなく「17」と解釈されます。

以下は、より堅牢でロケール固有になるように書き直された初期化関数です。

public void initialise() throws FileNotFoundException, ParseException {
  Scanner sc = new Scanner(new File("Gent_autobezit.csv"));
  sc.useDelimiter(";");
  for (int i = 0; i < 3; i++) {
    sc.nextLine();
  }
  while (sc.hasNext()) {
    String name = sc.next();
    name = name.trim();
    if (name.length() == 0)
      continue; // skip blank lines
    String number = sc.next();
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMANY);
    nf.setParseIntegerOnly(true);
    Number frm = nf.parse(number);

    Hood hood = new Hood(name, frm.intValue());
    sc.nextLine();
    System.out.print(hood.getInfo());
  }
}
于 2013-08-07T17:22:09.787 に答える