2012-09-27 6 views
0

이 문제를 제기 초기화 방법은 내가 가능한 한 간결하려고합니다, 설명을 조금 취는 CSV에서 객체의 배열이

내가 할 수있는 객체의 배열을 initalise하려고 한 이러한 개체 만 이 두 필드 (두 문자열) : 이름, 제조업체 나는 다음과 같은 형식으로 CSV 파일에서 읽어 필드를 초기화하는 것을 시도하고있다

:

토마토, 하인즈

콩, 제리

(줄 사이에 공백이 없어야합니다. 어떤 이유로이 사이트에서 서식을 지정하지 않습니다.)

각 행의 첫 번째 문자열은 이름이되고 싶은 값이고 두 번째는 제조업체입니다.

private void readFile (String inFilename) { 
    FileInputStream fileStrm = null; 
    InputStreamReader rdr; 
    BufferedReader bufRdr; 
    int lineNum; 
    String line; 
     try { 
      fileStrm = new FileInputStream(inFilename); 
      rdr = new InputStreamReader(fileStrm); 
      bufRdr = new BufferedReader(rdr); 
      lineNum = 0; 
      line = bufRdr.readLine(); 
      while {line != null) { 
       lineNum++; 
       processLine(line); //passes line to tokenizer 
       line = bufRdr.readLine(); 
       } 
      fileStrm.close(); 
     } 
     catch (IOException e) { 
      if (fileStrm != null) { 
       try { fileStrm.close(); } catch (IOException ex2) { } 
      } 
      System.out.println("Error in file processing: " + e.getMessage()); 
     } 
    } 

의 선이 토크 나이 메소드에 전달됩니다 :

은 그래서 하나의 값을 추출하는 토크 나이 방법의 각 줄에 전달하는 CSV, 각각의 라인을 읽는 방법을 만들었습니다

private String processLine(String csvRow) { 
    String thisToken = null; 
    StringTokenizer strTok; 
    strTok = new StringTokenizer(csvRow, ","); 
     while (strTok.hasMoreTokens()) { 
      thisToken = strTok.nextToken(); 
     } 
} 

그리고 여기에 내가 조금 붙어 있습니다. 배열을 초기화하려면 루프와 같은 것이 필요하다고 생각합니다.

for (int i=0; i<=array.length;i++) 
    { 
    array[i].name = readFile("filename.csv"); 
    array[i].manufacturer = readFile("filename.csv"); 
    } 

분명히 이것은 작동하지 않습니다. 아무도 내가 이것에 대해 어떻게 갈 수 있는지 제안 할 수 있습니까? 코드를 그대로 유지하고 기존 코드를 사용하여 솔루션을 찾아내는 것이 좋습니다.

+0

이 코드를 실행 한 결과는 무엇입니까 ?? 어떤 오류가 있습니까? –

+0

메서드를 올바르게 읽고 토큰 화하는 방법은이 메서드로 배열을 반복하는 방법을 잘 모르겠습니다. – Dawson

답변

0

우선

감사합니다 : - 당신은 processLine(line);을 요구하고 있지만,이 방법에서 읽을 token .. 그래서, 단지 거기 engulped이 방법에서 얻은 토큰을 반환하지 않습니다

.. 그래서, 당신은

둘째 .. 그 방법에서 뭔가를 반환해야합니다 : -

array[i].name = readFile("filename.csv"); 
array[i].manufacturer = readFile("filename.csv"); 

위의 코드에서 두 속성에 대해 매번 readFile()을 호출합니다. 따라서 아무 것도 반환하지 않아도이 두 속성은 동일한 값으로 초기화됩니다. 처음부터 파일 읽기를 시작할 때마다 ..

세 번째 일 - 당신이 배열에 readFile()의 값을 (이 실제로 아무것도 반환하지 않습니다)에 할당되어 있기 때문에 당신의 위의 코드는 .. 컴파일되지 않습니다 사실

.. 그래서 수익을 제공 이 메서드를 입력하십시오 .. String .. 토큰 반환 ..

편집 : - 내가 제안 *, 당신은 String 클래스의 split() 방법을 사용할 수 있습니다 ..Tokenizer is not needed here, for just 분할 around a single 쉼표 (,) '또한

아니라 배열을 사용하는 것보다, 당신이있는 당신은 새로 즉시 object을 만들어 .. 그 방법을 추가 할 수 있습니다, ArrayList을 사용할 수 있습니다, 당신은 배열의 fix the size 할 필요가 없습니다 ... (? 그리고 이것은 당신이 당신의 파일 오른쪽이 얼마나 줄 모르는 당신이 원하는 무슨이다)

다음

당신이 할 수있는 작업은 다음과 같습니다 -

  • 전화 방법어딘가에서 10, 아마 main()

    readFile("filename.csv") 
    
  • 당신의 readFile() 방법에있어서,이 같은 ArrayList를 만들 파일을 반복 할 수 있습니다 : -

    List<Can> yourList = new ArrayList<>(); 
    while ((line = reader.readLine()) != null) { 
    
        String[] wordRead = line.split(','); 
        yourList.add(new Can(wordRead[0], wordRead[1])); 
    } 
    

나는 가정 Can이의 이름입니다 귀하의 문제에 명시된대로 수업.

+0

고마워요, for 루프는 아직 내 코드의 일부가 아니지만 내 문제를 보여주는 시도했습니다. 배열을 초기화하기 위해 이러한 메서드를 호출하는 루프가 필요합니다. 나는 split 메소드를 조사 할 것이지만, 그건 내 문제를 해결하지 못한다. 배열을 초기화하는 방법이다. 토큰에 대한 수익을 추가하겠습니다 (이 작업을 수행했지만 간과 했음). – Dawson

+0

@Dawson .. 실제로'readFile'에서 어떤 값을 반환 할 필요는 없습니다. 한 번만 호출하면 그 파일 이름을 반복하고'ArrayList를 만듭니다 '.. –

+0

@ Rohit ..이게 어떻게 작동하는지 그림을 그리려는데, forFile 내의 forFile? 객체의 두 필드가 올바르게 초기화되도록 구조를 어떻게 구성합니까? – Dawson