2013-08-05 68 views
0

我需要从csv文件中读取数据,并且将更方便的数据放到2D数组中(我的脑海里最容易使用此“时间表”数据) 。 每个文件的行包含在以下格式的信息:从csv文件中提取数据并将其放入2D数组 - 重构

Instructor, Course, Group, Student, Result

如下例子:

Paul Schwartz,Introduction to Computer Architecture,I1,Ben Dunkin,88 
Muhamed Olji,Object Oriented Programming,I4,Mike Brown,73 

但我的代码需要一些简化。但我不知道如何使它更容易,并要求

代码:

private String[][] fileContent(String pathToCSVFile) { 
    final int ROWS = 100; 
    final int COLUMNS = 5; 
    String fileData[][] = new String[ROWS][COLUMNS]; 
    Scanner scanner = new Scanner(pathToCSVFile); 
    boolean done = false; 
    int i, j; 

    while (!done) { 
     for (i = 0; i >= 0; i++) { 
      for (j = 0; j >= 0; j++) { 
       String str[] = scanner.nextLine().split(","); 
       for (int element = 0; element < str.length; element++) { 
        fileData[i][element] = str[element]; 
        if (i >= ROWS) { 
         Arrays.copyOf(fileData, fileData.length * 2); 
        } 
       }     
      } 
     } 

     if (!scanner.hasNextLine()) done = true; 
    } 

    return fileData; 
} 
  • 如何重构此代码段为更好的简单?
  • 对于部分填充的数组是否存在更好的方法(比Arrays.copyOf(fileData, fileData.length * 2))?
+0

如果简单是你的目标,使用CSV库,如openCSV,它有一个'列表 lines = new CSVReader(reader).readAll();'方法...然后你的方法成为一线(可能两个)。 – assylias

+0

请考虑在http://codereview.stackexchange.com/上发布此类问题。该网站应该更合适。 –

+0

@assylias我[尝试这种方式](http://pastebin.com/sfizSsuc)但从List转换为数组有点问题。任何建议也可以在这里找到。 –

回答

2

使用openCSV,你可以得到一个列表包含所有行并将其转换为一个数组(或只保留列表):

try (CSVReader reader = new CSVReader(new BufferedReader(
      new FileReader(pathToCSVFile)));) { 

    List<String[]> lines = reader.readAll(); 
    return lines.toArray(new String[lines.size()][]); 
} 

(使用Java 7的尝试与资源语法)

+0

做这个阅读后,我们需要一些小问题来提取正确的数据。如何拆分这一个字符串并在未来使用? –

+0

您有一个包含csv中所有字段的二维数组。你可以循环并获得你需要的东西。 – assylias

1

首先,小心那些for循环。它们是“几乎”未定义的循环,因为它们以i,j = 0开始,并且当> = 0时循环(总是,直到它们溢出到负数)。 为什么你还需要它们?我想和你在一起,而为了(元素)你完成了,对吗? 类似的东西(我没试过,只是概念解释)

private String[][] fileContent(String pathToCSVFile) { 
    final int ROWS = 100; 
    final int COLUMNS = 5; 
    String fileData[][] = new String[ROWS][COLUMNS]; 
    Scanner scanner = new Scanner(pathToCSVFile); 
    boolean done = false; 
    int i=0; 

    while (!done) { 
     String str[] = scanner.nextLine().split(","); 
     for (int element = 0; element < str.length; element++) { 
      fileData[i][element] = str[element]; 
      if (i >= ROWS) { 
       Arrays.copyOf(fileData, fileData.length * 2); 
      } 
     } 
     if (!scanner.hasNextLine()) 
      done = true; 
     else 
      i++; 
    } 
    return fileData; 
} 

顺便说一句,你为什么不使用的对象,如一个ArrayList?它会让你的生活更轻松,所以你不必担心内存处理。你只需添加新的对象。

一样的东西ArrayList <ArrayList <String>>

+0

我同意你的使用对象更方便,但我需要对'Result'和'Group'进行排序,并将学生的顶部显示为'1'。 Ben Dunkin 88;'。但是我不知道如何对这个''进行精确排序,并且在这个节目收集后还有学生姓名? –

+0

实际上,对ArrayList进行排序非常简单,无论是实现Comparable还是使用Comparator。 优雅的解决方案是实现一个类(或多个,取决于您的需要),它代表您的行,并实现Comparable接口。在此之后,如果您有一个'ArrayList al'',您可以执行'Collections.sort(al)''对您的数组进行排序。 当然,所有这些对象都使用OpenCSV库进行初始化。你不应该重新发明轮子。 –

相关问题