【问题标题】:CSV file split values all nullCSV 文件拆分值全部为空
【发布时间】:2016-11-06 22:26:47
【问题描述】:

我正在研究这种从 csv 文件中获取数据并将它们存储到数组中的方法。我编译的代码但每个数组的值都是“null”。我不知道为什么会这样。

csv 文件看起来像这样,但持续了 91 行:

2016 年 9 月 1 日星期日,,,,,16:00,20:00
星期一,9/2/2016,8:00,12:00,,,,
星期二,9/3/2016,8:00,12:00,12:00,16:00,,
星期三,9/4/2016,,,,,16:00,20:00
星期四,9/5/2016,8:00,12:00,,,,
星期五,9/6/2016,,,12:00,16:00,,
星期六,9/7/2016,,,,,16:00,20:00

public static void getData() throws FileNotFoundException {
    File timeSheets = new File("timeSheets.csv");
    Scanner ts = new Scanner(timeSheets);
    int n = 0, c = 0;

    String temp;

    while (ts.hasNext()) {
        temp = ts.nextLine();
        c++;
    }

    String[] field = new String[8];
    String[] day = new String[c];
    String[] date = new String[c];
    Integer[] morn = new Integer[c];
    Integer[] after = new Integer[c];
    Integer[] night = new Integer[c];

    while (ts.hasNext()) {
        temp = ts.nextLine();
        field = temp.split(",");
        day[n] = field[0];
        date[n] = field[1];

        if (field[4].equals("")) {
            morn[n] = 0;
        } else {
            morn[n] = (int) (Double.parseDouble(field[4].replace(":", "."))
                    - Double.parseDouble(field[3].replace(":", ".")));
        }

        if (field[6].equals("")) {
            after[n] = 0;
        } else {
            after[n] = (int) (Double.parseDouble(field[6].replace(":", "."))
                    - Double.parseDouble(field[5].replace(":", ".")));
        }

        if (field[8].equals("")) {
            night[n] = 0;
        } else {
            night[n] = (int) (Double.parseDouble(field[8].replace(":", "."))
                    - Double.parseDouble(field[7].replace(":", ".")));

        }
        n++;
    }
    System.out.print(day.length);
    System.out.println();
    for (int i = 0; i < day.length; i++) {
        System.out.println(day[i]);
    }

    ts.close();
}

【问题讨论】:

  • 您在第一个 while 循环中耗尽了所有行 - 所以当第二个循环开始时什么都没有留下...您可以在第二个循环之前添加一个 ts = new Scanner(timeSheets);。但是为了获取数组的大小而读取文件两次是非常低效的......

标签: java


【解决方案1】:

我只是尝试运行您的代码。我看到第二个 while 从未循环过。 ts.hasNext() 方法总是返回 false。因为流资源在第一个while里已经被读取,并且被关闭了。

解决方案:你应该重新初始化对象扫描器。

注意:您可以通过打印扫描仪对象来验证我所说的内容。你会得到如下结果:

java.util.Scanner[delimiters=\p{javaWhitespace}+][position=238][match valid=false][need input=false][source closed=true][skipped=false][group separator=\,][decimal separator=\.][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\Q?\E][infinity string=\Q?\E]7

【讨论】:

    【解决方案2】:

    您没有在阅读文件。 new File("timeSheets.csv") 仅创建对文件的引用。您必须阅读该文件的内容。

    有很多库可以让您轻松完成这项工作。 rt.jar 中提供此功能的基本类是FileReader

    【讨论】:

    • 不是真的:Scanner ts = new Scanner(timeSheets);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多