2013-08-05 81 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庫進行初始化。你不應該重新發明輪子。 –

相關問題