【问题标题】:Java reading csv and understanding typesJava 读取 csv 和理解类型
【发布时间】:2017-03-24 17:40:52
【问题描述】:

我需要读取 csv 文件。该文件有一些不同的类型,如intfloatStringchar。我怎么知道是什么类型?

我确实为它编写了一些代码,但我的问题是浮点数。在我的计算机中,java 说“7.9”不是浮点数,但“7,9”是。

但在某些计算机上,“7.9”是一个浮点数。我该如何解决这个问题?

public static void Read(String filename) throws FileNotFoundException{

    File file = new File(filename);
    Scanner scanner1 = new Scanner(file);
    String line ;
    Scanner scanner;
    int a;
    float f;
    String temp ;
    while(scanner1.hasNextLine()){
        line = scanner1.nextLine();
        scanner = new Scanner(line);
        scanner.useDelimiter(",|\\n");
        while (scanner.hasNext()){

            if (scanner.hasNextInt()){
                a = scanner.nextInt();
                System.err.printf("Int :%d",a);
            }
            else if(scanner.hasNextFloat()){
                f = scanner.nextFloat();
                System.err.printf("flt :%f",f);

            }
            else {
                temp = scanner.next();
                if(temp.length() == 1)
                    System.err.printf("char:%s",temp);
                else
                    System.err.printf("string:%s",temp);
            }
        }
        System.err.printf("\n");

        scanner.close();
    } 
} 

【问题讨论】:

  • 注意:这将无法正确读取包含逗号的字符串的 CSV 文件。即)1,2,3,"A,B,C" 包含 4 个值,最后一个是带有 2 个逗号的字符串。您应该使用适当的 CSV 库。

标签: java floating-point


【解决方案1】:

我越读越明白我错了。

如果你的 CSV 数据是这样的

1,2,3,4

那么它可以是 (1,2 和 3,4) 例如 (1.2, 3.4) 或者它可以是整数 1 到 4

如果引用正确 "1,2","3,4"

然后您的解析器将无法工作,因为它没有使用引号作为分隔符。

因此,如果没有看到数据,就很难说是什么导致了您的问题。 您可以在扫描仪中添加对引号的处理,但如果您的 vlaues 本身包含引号,则会涉及更多情况

最好使用正确的 CSV 解析,例如 http://opencsv.sourceforge.net/

否则,您需要遍历您的数据并确保您的解析涵盖了您今天拥有的所有案例,以及明天可能拥有的所有案例。

解决方法是使用 replaceAll(".",","); 修改您的字符串。但是再次执行此操作时会有很多缺陷,您的扫描仪可能会将这些元素混淆为 CSV 中的新条目。

特别是要从表示小数从 1,2 更改为 1.2,您可以使用

修改您想要的数字类型的 Local
scanner1.useLocale(Locale.US);

据我所知,没有办法为扫描仪设置多个区域设置。一种方法是使用两个扫描仪,同时使用两个不同的 Locale 以不同方式解析浮点数。

【讨论】:

  • 替换“.”使用“,”在指定点不起作用。 CSV 行包含 逗号 分隔值;因此,您可以将该行转换为包含 8 个整数,而不是 4 个浮点值。
  • 好点,所以你必须做这行 =scanner1.nextLine().replaceAll(",",";"); line =scanner1.nextLine().replaceAll(".",",");扫描仪.useDelimiter(";|\\n");再次取决于数据
  • 关闭,但不完全。您读入一行,将逗号转换为分号,然后将其丢弃,读入下一行,并将句点转换为逗号。你想要line = scanner1.nextLine().replaceAll(",",";").replaceAll(".",","); 再次,仍然是错误的方法;最好更改扫描仪的区域设置。
  • 我同意 Locale 是最正确的,除了他想同时支持两种形式。哪个语言环境不允许。
  • 运行两个具有不同区域设置的扫描程序可能更有效
【解决方案2】:

您可以使用 #useLocale(java.util.Locale) 更改扫描仪的区域设置

将区域设置设置为使用. 作为小数点的区域。即)

scanner.useDelimiter(",|\\n");   
scanner.useLocale( Locale.US );    // Use '.' as decimal point

【讨论】:

    猜你喜欢
    • 2018-11-13
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    相关资源
    最近更新 更多