Java 通过提取列值修改并生成新的csv文件

Java 通过提取列值修改并生成新的csv文件,java,file,csv,filestream,opencsv,Java,File,Csv,Filestream,Opencsv,我想用大数据集修改csv文件的列值。因此,我提取了单列值(这里是第二个),然后通过while循环的2次迭代找到标准偏差。第一个用于查找平均值,第二个用于查找标准偏差。标准偏差与提取的值相乘,并用其替换。然后生成更新的csv文件。在这里,当我运行代码时,它通过无while循环迭代成功地生成带有空白文件的新文件。我认为while循环和it没有读取文件都有问题。我不知道是什么?标准偏差(σ=√[(∑(x-平均值))2÷n])请帮助我 package csvtest7; import java.

我想用大数据集修改csv文件的列值。因此,我提取了单列值(这里是第二个),然后通过while循环的2次迭代找到标准偏差。第一个用于查找平均值,第二个用于查找标准偏差。标准偏差与提取的值相乘,并用其替换。然后生成更新的csv文件。在这里,当我运行代码时,它通过无while循环迭代成功地生成带有空白文件的新文件。我认为while循环和it没有读取文件都有问题。我不知道是什么?标准偏差(σ=√[(∑(x-平均值))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);
    }


}
包csvtest7;
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.util.Scanner;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入java.io.FileWriter;
导入java.io.*;
公共类Csvtest7{
公共静态void main(字符串[]args)引发IOException{
字符串filename=“ly.csv”;
文件=新文件(文件名);
BufferedWriter=null;
试一试{
writer=newbufferedwriter(newfilewriter(“ly_updated.csv”);
} 
捕获(IOE异常){
} 
试一试{
扫描仪输入流=新扫描仪(文件);
inputStream.next();
双元组;
整数计数=0;
元组=0;
双标准差=0;
双stddev1;
双stddev2;
//双席;
双均值;
双标准差;
while(inputStream.hasNext()){
字符串数据=inputStream.next();
字符串[]值=数据。拆分(“;”);
double balance=double.parseDouble(值[2]);
余额=余额+1;
元组+=平衡;
}
平均值=元组/计数;
while(inputStream.hasNext()){
字符串数据=inputStream.next();
字符串[]值=数据。拆分(“;”);
double balance=double.parseDouble(值[2]);
stddev=平衡平均值;
stddev1=(stddev*stddev);
stddev2=(stddev1/计数);
标准偏差=数学sqrt(STDEV2);
平衡=标准偏差*平衡;
值[2]=字符串.valueOf(余额);
//遍历这些值并从中生成一个字符串
StringBuilder sb=新的StringBuilder();
//字符串newData=sb.toString();
对于(int i=0;i
您正在跳过第二个while循环

您正在成功地执行第一个while循环
while(inputStream.hasNext()){
,直到没有更多的令牌可从文件读取。现在,您的第二个while循环再次显示
while(inputStream.hasNext()){
现在,由于您已经读取了文件,它不会将指针移回文件的开头,它会说没有更多的令牌可从文件读取,因此跳过第二个while循环

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

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


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

我是编程任务的新手,所以我不知道在哪里更改代码。你可以发布第一个建议的ans的代码片段吗。我编辑了我的答案。请看一看,让我知道这是否有意义现在,我想我需要2个循环,因为第一个循环求平均值,第二个循环在每次迭代中都会用到它。在两个循环中唯一的一个附加值是
balance=balance+1;Tuple+=balance;
,你在第一个循环中做的,它也可以和第二个循环的内容一致。我想第二个循环在每次迭代中都需要平均值。对于f我们只有在成功的迭代后才能得到平均值,所以先让它循环2次,然后在第二次中使用它。