2013-08-05 5 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

간단 함을 목표로한다면, '목록 lines = new CSVReader (reader) .readAll();'메서드가있는 openCSV와 같은 CSV 라이브러리를 사용하십시오. 하나의 라이너 (ok 아마 2)가된다. – assylias

+0

http://codereview.stackexchange.com/에서 이러한 질문을 게시하는 것을 고려하십시오. 사이트가 더 적합해야합니다. –

+0

@assylias [이 방법을 시도] (http://pastebin.com/sfizSsuc)하지만 목록에서 배열로 변환하는 데는 약간의 문제가 있습니다. 어떤 제안도 여기에서 이용할 수 있습니다. –

답변

2

같은

무엇인가, 당신은 모든 라인을 포함하는 목록을 얻을 수 및 배열로 변환 (또는 목록을 유지) 할 수 있습니다

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

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

(사용하여 Java 7 시도 -with-resources 구문)

+0

이 독서를 한 후에 필요한 작은 문제가 올바른 데이터를 추출합니다. 어떻게이 하나의 문자열을 분리하고 앞으로 사용할 것인가? –

+0

CSV의 모든 필드를 포함하는 2D 배열이 있습니다. 그냥 반복해서 원하는 것을 얻을 수 있습니다. – assylias

1

먼저 루프 용으로주의하십시오. 그들은 "거의"정의되지 않은 루프입니다. 왜냐하면 i, j = 0으로 시작하고> = 0 인 동안 루프합니다 (항상 음수로 오버플로 할 때까지). 어쨌든 왜 필요합니까? 나는 너와 함께 생각하고 (요소) 너는 끝났다고 생각해? 그런 뭔가 이유를 ArrayList에 같은 객체를 사용하지 않는, 그런데

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; 
} 

(나는 시도하지 않은, 단지 개념을 설명하는 것입니다)? 그것은 당신의 삶을 편하게 해줄 것이므로 메모리 처리에 대해 걱정할 필요가 없습니다. 새로운 객체를 추가하기 만하면됩니다. openCSV를 사용하여 ArrayList <ArrayList <String>>

+0

나는 객체 사용이 훨씬 더 편리하다는 것에 동의하지만'결과'와'그룹'을 정렬하고 학생의 최상위를'1 '로 표시해야합니다. 벤 던킨 88; 그러나이 ''을 정확하게 분류하는 방법을 알지 못하고이 프로그램을 학생 이름과 함께 수집 한 후에는 어떻게해야합니까? –

+0

실제로, ArrayList를 정렬하는 것은 Comparable을 구현하거나 Comparator를 사용하는 것은 매우 쉽습니다. 우아한 해결책은 행을 나타내는 클래스를 구현하는 것입니다 (또는 필요에 따라 둘 이상). 그리고이 클래스는 Comparable 인터페이스를 구현합니다. 이 후,'ArrayList al;이 있으면'Collections.sort (al);'을 사용하여 배열을 정렬 할 수 있습니다. 물론이 모든 객체는 물론 OpenCSV 라이브러리로 초기화되었습니다. 바퀴를 재발 명하면 안됩니다. –

관련 문제