2015-02-07 9 views
1

대용량 데이터 세트가있는 csv 파일의 열 값을 수정하고 싶습니다. 그래서 나는 단일 열 값 (여기서는 2 위)에서 추출한 다음 두 번 반복하여 표준 편차를 찾았고 while 루프는 첫 번째 발견을 위해 그리고 두 번째는 표준 편차를 찾았습니다. 표준 편차는 추출 된 값과 곱해지고 그 값은 그 값으로 대체됩니다. 업데이트 된 csv 파일을 생성하십시오. 여기에 내가 루프를 반복하지 않고 빈 파일을 성공적으로 새 파일을 생성하는 코드를 실행할 때. while 루프 나 파일을 읽지 않는 문제가 있다고 생각합니다. 나는 그것이 무엇인지 모른다. 표준 편차 (σ = √ [(Σ (X - MEAN)) ÷ 2 N])는 PLS 넌 루프 동안 초 스킵되는 날열 값을 추출하여 새로운 csv 파일을 수정하고 생성하십시오.

package csvtest7; 
    import java.io.File; 
    import java.io.FileNotFoundException; 
    import java.util.Scanner; 
    import java.util.logging.Level; 
    import java.util.logging.Logger; 
    import java.io.FileWriter; 
    import java.io.*; 

    public class Csvtest7 { 

    public static void main(String[] args)throws IOException { 
    String filename = "ly.csv"; 
    File file = new File(filename); 
    BufferedWriter writer = null; 
    try { 
     writer = new BufferedWriter(new FileWriter("ly_updated.csv")); 
    } 
    catch (IOException e) { 
    } 
    try { 
     Scanner inputStream = new Scanner(file); 
     inputStream.next(); 
     double Tuple; 
     int count=0; 
     Tuple = 0; 
     double stddev=0; 
     double stddev1; 
     double stddev2; 
     //double Xi; 
     double MEAN; 
     double standarddeviation; 
while (inputStream.hasNext()) { 
     String data = inputStream.next(); 
     String[] values = data.split(";"); 
     double balance = Double.parseDouble(values[2]); 
     balance = balance + 1; 
     Tuple += balance ; 
      } 
     MEAN=Tuple/count; 
while (inputStream.hasNext()) { 
     String data = inputStream.next();   
     String[] values = data.split(";"); 
     double balance = Double.parseDouble(values[2]); 
     stddev=balance-MEAN; 
     stddev1=(stddev*stddev); 
     stddev2=(stddev1/count); 
     standarddeviation=Math.sqrt(stddev2);  
     balance=standarddeviation*balance; 
     values[2] = String.valueOf(balance); 


     // iterate through the values and build a string out of them 
     StringBuilder sb = new StringBuilder(); 
     // String newData = sb.toString(); 
     for (int i = 0; i < values.length; i++) { 
       sb.append(values[i]); 
       if (i < values.length - 1) { 
        sb.append(";"); 
       } 

      } 
     // get the new string 
     System.out.println(sb.toString()); 
     writer.write(sb.toString()+"\n"); 
      } 
     writer.close(); 
     inputStream.close(); 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(Csvtest7.class.getName()).log(Level.SEVERE, null, ex); 
    } 


} 

답변

0

도움.

파일에서 읽을 토큰이 없어 질 때까지 루프 while (inputStream.hasNext()) {이 성공적으로 실행되는 동안 처음 실행됩니다. 이제 두 번째 while 루프는 다시 while (inputStream.hasNext()) {라고 말합니다. 이미 파일을 읽었으므로 포인터를 파일의 시작 부분으로 옮기지 않을 것이며 파일에서 읽을 토큰이 더 이상 없으므로 두 번째 while 루프를 건너 뜁니다. 이 문제를 해결하려면

한 가지 방법으로 inputStream을 다시 정의하는 것입니다

inputStream = new Scanner(file); 
while (inputStream.hasNext()) {//start second while loop. 

또는 첫 번째 내 다른

루프, 당신은 당신이 루프 동안 두 번째로 무엇을하려고 처리 할 수있는 동안 . while 루프는 필요하지 않습니다.

+0

메신저 프로그래밍 작업에서 새로운 아이디어를 얻지 못해 어디서 코드를 변경했는지 .. 제안 된 첫 번째 코드 스 니펫을 게시 할 수 있습니다. –

+0

나는 내 대답을 편집했다. 좀 이해해 주시길 바랍니다. – SMA

+0

여기에 내가 1 루프 찾기 의미와 두 번째 반복마다 그것을 사용하므로 2 루프가 필요하다고 생각해. –