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());
        }        
    }
}

还有“Hoodclass-code”

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
;;;;;;;;;
 ;;;;;;;;;
 ;;;;;;;;;
 ;;;;;;;;;

编辑:添加导入命令:

import java.util.Locale;

// 和 sc.useLocale.... 在 sc.useDelimiter 之后

sc.useLocale(Locale.GERMAN);

解决了一些问题。问题的最大根源在于:

while(sc.hasNext())
4

1 回答 1

0

你的电脑有什么症状?我正在查看代码,以下方面似乎令人惊讶:

  • 您丢弃了前三行 (sc.nextLine()),但您似乎没有检查文件是否有 3 行可供提供。您和您的朋友是否使用相同的 CSV?
  • CSV 文件包含错误的输入,但您没有考虑到它。

我认为这是一个数字格式问题,不是因为文件包含浮点数,而是因为文件包含欧洲格式的数字(即 17.460 实际上是 17460) - 它可能适用于您朋友的计算机的原因是因为他们使用的是美国语言环境和数字被解释为“17”而不是“17460”。

这是重写的初始化函数,使其更加健壮和特定于语言环境:

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 回答