Reading a stream in java

I am working on a comma separated value file.i, want to extract the value at first position ["0" place in array] from each source, and want to do math on it.

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

      

for getting the first position it gives me an error like this

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

      

it works fine for the second and third position, but for the fourth it gives the same error as the first one.

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

    }
}              

      

here, for example, I retrieved the values ​​[1] (means the second position in the array, for example 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

      

this code works for values ​​[1] and value [2] not in values ​​[0] and value [3] .. why can't I figure out what helps me ...

+3


source to share


4 answers


There were problems in your code in terms of exception throwing and readability.

I rewrote your code and it works:

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 file:

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

      



Output CSV file:

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

      


The following changes have been made:

  • Replaced inputStreamm.next();

    byinputStreamm.nextLine();

  • The code has been updated. Processing is done first values

    and then values1

    .
  • Added if (inputStreamm.hasNext())

    for processing NoSuchElementException

    .
  • Replaced Double.parseDouble(values1[1]);

    with Integer.parseInt(values1[1]);

    as it generated 34.0

    and you wanted 34

    in your output file.
0


source


When you read a string, it obviously comes back with surrounding quotes, as such:

"12,32,45,76"

      

So when you split it, you get the following items:



"12
32
45
76"

      

As you can see, the first and last elements in the line are not numbers, and therefore your call to Double.ParseDouble (..) fails.

You have to either modify the original string (either with substitution or, more preferably, using .reaplce ("\" "," ")) or check each item after splitting and then replace / trim the quote.

+1


source


Both bacause [1] and value [2] have quotes, you must use quotes String.replaceAll ().

0


source


I can see various problems:

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

      

Why are you declaring and instantiating inputStream

two times?

What are you trying to do with this:

        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;

      

It smells like repetition to me.

EDIT: I quickly completed one program that will work for you:

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

    }

      

It prints: 12,23,32,73,73,

. You need to clean up a bit, but that will give you an idea.

0


source







All Articles