在 java 中读取流文件

Read streamfile in java

我正在处理逗号分隔值file.i想从每个原始数据中提取第一个位置[数组中的“0”位置]值,并想对其进行一些数学计算。

csv inputfile is like this
a,b,c,d
12,32,45,76
23,45,77,56
32,34,49,28
73,92,26,68
73,36,77,26

为了获得第一名,它给我这样的错误

Exception in thread "main" java.lang.NumberFormatException: For input string: ""12"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1268)

at java.lang.Double.parseDouble(Double.java:548)
    at rotation.pkg45.Rotation45.main(Rotation45.java:49)//code line no-49

它在第二和第三位置上工作正常,但对于第四位置它给出与第一位置相同的错误。

 package rotation.pkg45;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.*;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;
public class Rotation45 {
 public static void main(String[] args)throws IOException {
        String filename = "bank-full2.csv";
        ArrayList<String> namesList = new ArrayList<String>( );
        String[] t1;
       // StringBuilder sb;
        List<Double> list = new ArrayList<Double>();
        File file = new File(filename);
        BufferedWriter writer = null;

        try {
            writer = new BufferedWriter(new FileWriter("bank2test1.csv"));     
               double a1=0.866025;
        double a2=0.5;
        double a3=-0.5;
        double a4=0.866025;
        double b1;
        double b2;
        double c1;
        double c2;          

            Scanner inputStream = new Scanner(file);
            inputStream.next();  
             Scanner inputStreamm = new Scanner(file);
            inputStreamm.next();          

         while (inputStreamm.hasNext()) {   //while loop for find MEAN
            String data = inputStreamm.next();   //read each line and store in data
            String[] values = data.split(",");  //every line splited with " ; " and store each attribute in string list 

            double first = Double.parseDouble(values[1]); 


          /* no suchelementexeption  */  String data1 = inputStreamm.next();   //read each line and store in data
            String[] values1 = data1.split(",");  
            //inputStream.next();          
            double second = Double.parseDouble(values1[1]); 

            c1= ((a2*second)+(a1*first));
    c2= ((a3*first)+(a4*second));
       values1[2] = String.valueOf(c2);
        values[2] = String.valueOf(c1);
       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(",");
                }
                    }
             sb.append("\n");
              for (int i = 0; i<values1.length ; i++) {
                    sb.append(values1[i]);
                    if (i < values.length - 1) {
                    sb.append(",");
                }
                    }
            // get the new string
           // System.out.println(sb.toString());

            writer.write(sb.toString()+"\n");
                }
            writer.close();

            inputStreamm.close();


            }
        catch (FileNotFoundException ex)
              {
            Logger.getLogger(Rotation45.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}              

例如,这里我提取了值[1](表示数组中的第二个位置,如 32、45、34,..)

so result will be..
12,34,45,76
23,46,77,56
32,36,49,28
73,93,26,68
73,38,77,26

此代码适用于值[1]和值[2],不适用于值[0]和值[3]..为什么我不明白请帮助我...

因为值[1]和值[2]有引号,你应该String.replaceAll()引号。

我能注意到各种问题:

 Scanner inputStream = new Scanner(file);
 inputStream.next();  
 Scanner inputStreamm = new Scanner(file);
 inputStreamm.next(); 

为什么要声明和实例化 inputStream 两次?

你想用这个做什么:

        String data = inputStreamm.next();   //read each line and store in data
        String[] values = data.split(",");  //every line splited with " ; " and store each attribute in string list 
        double first = Double.parseDouble(values[1]); 
        first=first+2;
        String data1 = inputStreamm.next();   //read each line and store in data
        String[] values1 = data1.split(",");  
        //inputStream.next();          
        double second = Double.parseDouble(values1[1]); 
        second=second+1;

我闻到了重复的味道。

编辑:我很快编写了一个程序来为您完成这项工作:

public static void main(String[] args) {
        String csvFile = "src/files/text/simple.csv";
        BufferedReader br = null;
        String line = "";
        String cvsSplitBy = ",";
        boolean readingHeader = true;
        String integerValues = "";
        try {

            br = new BufferedReader(new FileReader(csvFile));
            while ((line = br.readLine()) != null) {
                // use comma as separator
                if(readingHeader) {
                    readingHeader = false;
                    continue;
                }
                String[] values = line.split(cvsSplitBy); // we get ints here.
                integerValues = integerValues + values[0] + ",";
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println(integerValues);

    }

它打印:12,23,32,73,73,。你需要做一些清理,但它会给你想法。

当您阅读该行时,它显然 returns 带有引号,例如:

"12,32,45,76"

所以当你拆分它时,你会得到以下元素:

"12
32
45
76"

如您所见,行中的第一个和最后一个元素不是数字,因此您的 Double.ParseDouble(..) 调用失败。

您应该修改原始字符串(通过对其进行子字符串化或更好地使用 .reaplce("\"", ""))或在拆分后检查每个元素然后替换 /trim 引号。

您的代码在生成异常和可读性方面存在一些问题。

我重写了您的代码,它正在运行:

package rotation.pkg45;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Rotation45 {
    public static void main(String[] args) throws IOException {
        String filename = "bank-full2.csv";
        File file = new File(filename);
        BufferedWriter writer = null;

        try {
            writer = new BufferedWriter(new FileWriter("bank2test1.csv"));

            Scanner inputStreamm = new Scanner(file);
            inputStreamm.nextLine();

            while (inputStreamm.hasNext()) { // while loop for find MEAN
                String data = inputStreamm.nextLine(); // read each line and store in data
                String[] values = data.split(","); // every line splited with " , " and store each attribute in string list

                // double value is generating 34.0 value, and you are expecting only 34
                // double first = Double.parseDouble(values[1]);
                int first = Integer.parseInt(values[1]);
                first = first + 2;

                values[1] = String.valueOf(first);
                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(",");
                    }
                }

                if (inputStreamm.hasNext()) { /* To handle NoSuchElementException */
                    String data1 = inputStreamm.nextLine(); // read each line and store in data
                    String[] values1 = data1.split(",");

                    // double second = Double.parseDouble(values1[1]);
                    int second = Integer.parseInt(values1[1]);
                    second = second + 1;
                    values1[1] = String.valueOf(second);

                    sb.append("\n");
                    for (int i = 0; i < values1.length; i++) {
                        sb.append(values1[i]);
                        if (i < values.length - 1) {
                            sb.append(",");
                        }
                    }
                }
                writer.write(sb.toString() + "\n");
            }
            writer.close();

            inputStreamm.close();

        } catch (FileNotFoundException ex) {
            Logger.getLogger(Rotation45.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

CSV 输入文件:

a,b,c,d
12,32,45,76
23,45,77,56
32,34,49,28
73,92,26,68
73,36,77,26

CSV 输出文件:

12,34,45,76
23,46,77,56
32,36,49,28
73,93,26,68
73,38,77,26

所做的更改是:

  1. Replaced inputStreamm.next(); with inputStreamm.nextLine();
  2. Code refactored. Processing of values is done first and then values1.
  3. Added if (inputStreamm.hasNext()) to handle NoSuchElementException.
  4. Replaced Double.parseDouble(values1[1]); with Integer.parseInt(values1[1]);, as it was generating 34.0 and you wanted 34 in your output file.