2015-02-07 3 views
1

Я хочу изменить значения столбцов csv-файла с большим набором данных. поэтому я выделил значения одиночных столбцов (здесь 2-й), а затем нашел стандартное отклонение на 2-х итерацию while loop.1st для поиска среднего и 2-го для поиска стандартного отклонения. стандартное отклонение умножается на извлеченное значение и что значения заменяются им. затем сгенерировать обновленный файл csv. здесь, когда я запускаю код, он успешно сгенерирует новый файл с пустым файлом без цикла итерации цикла. Я думаю, что есть что-то проблемы с циклом while, или он не читает файл. я не знаю, что это такое? стандартное отклонение (σ = √ [(Σ (х - среднее значение)) 2 ÷ N]) Просьба помочь мнеизменить и сгенерировать новый файл 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 while (inputStream.hasNext()) {, пока не осталось больше токенов для чтения из файла. Теперь ваш второй цикл while говорит: while (inputStream.hasNext()) { Теперь, когда вы уже прочитали файл, он не будет перемещать указатель назад к началу файла, и он сказал бы, что больше нет токенов для чтения из файла и, следовательно, пропускает второй цикл while.

Одним из способов решения этой проблемы является переопределение InputStream как:

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

Или

еще в вашей первой во время цикла, вы могли бы сделать обработку, что вы пытаетесь сделать в секунду в то время как цикл , Вам не нужен второй цикл while.

+0

im новое в программировании задачи, поэтому я не получаю точную идею, где я меняю код .. могу опубликовать фрагменты кода из 1-го предложения. –

+0

Я отредактировал свой ответ. Пожалуйста, посмотрите и сообщите мне, если это имеет смысл сейчас. – SMA

+0

здесь я думаю, мне нужно 2 цикла, потому что 1-й петле найти среднее, а второе будет использовать его на каждой итерации. –