通过提取列值来修改和生成新的csv文件

时间:2015-02-07 17:11:28

标签: java file csv filestream opencsv

我想修改具有大型数据集的csv文件的列值。所以我提取了单列值(这里是第2个),然后通过2次迭代找到标准偏差,while循环找到平均值,第2次找到标准偏差。标准偏差乘以提取值,并将该值替换为它。然后生成更新的csv文件。在这里,当我运行代码时,它通过没有while循环迭代成功生成带有空白文件的新文件。我认为while循环或者它没有读取文件存在问题。我不知道它是什么?标准差(σ=√[(Σ(x - MEAN))2÷n])请帮帮我

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


}

1 个答案:

答案 0 :(得分:0)

你正在跳过第二个while循环。

首先成功执行while while (inputStream.hasNext()) {,直到没有更多的令牌从文件中读取。现在你的第二个while循环再次显示while (inputStream.hasNext()) {现在,因为你已经读过该文件,它不会将指针移回文件的开头,它会说没有更多的标记要从文件中读取,因此会跳过第二次循环。

解决此问题的一种方法是将inputStream重新定义为:

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

在你的第一个while循环中,你可以在第二个while循环中处理你想要做的事情。你不需要第二次循环。