2016-11-06 59 views
0

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

CSV文件看起来像这样但持续91行:

星期日,9个/二千零十六分之一,,,,, 16:00,20:00
星期一,9/2/2016,8 :00,12:00 ,,,,
星期二,9/3/2016,8:00,12:00,12:00,16:00 ,,
星期三,9个/2016分之4,,,, ,16:00,20:00
星期四,9/5/2016,8:00,12:00 ,,,,
周五9 /二千零十六分之六,,, 12:00,16:00 ,,
2016年9月7日星期六,,,,, 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(); 
} 
+0

你用尽第一个全行while循环 - 因此没有留在第二循环开始的时候......你可以添加一个'TS =新的扫描仪(时间表); '在第二个循环之前。但是为了获得阵列的大小而读两次文件是相当低效的...... – assylias

回答

-1

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

有很多,让这样简单的库。 rt.jar中提供此功能的基本类是FileReader

+0

不是真的:'扫描仪ts =新的扫描仪(时间片);' – assylias

+0

啊是的..傻我。 –

1

我只是尝试运行代码。我发现第二次没有回圈。方法ts.hasNext()总是返回false。因为流资源在第一次被读取并被关闭。

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

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

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