2015-05-14 4 views
3

Я работаю над значением, разделенным запятыми file.i, чтобы извлечь первое значение ["0" место в массиве] из каждого исходного и хотеть какой-то математический расчет на нем.Чтение файла потока в java

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

** Исключение в потоке «основного» java.lang.NumberFormatException: Для ввода строки: «» 12" **, как вы видите, в файле CSV есть дополнительные цитаты до 12 числа –

+0

@SercanOzdemir I не видите никакой цитаты в csv op? Можете ли вы сказать, где они находятся? –

+0

нет никакой цитаты, такой как «» во входном файле (bank-full2) ... –

ответ

0

В вашем коде были проблемы с точки зрения генерации исключения и удобочитаемости.

я переписал свой код и он работает:

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. Заменено inputStreamm.next(); с inputStreamm.nextLine();
  2. кодекса реорганизованным. Сначала обрабатывается values, а затем values1.
  3. Добавлен if (inputStreamm.hasNext()) для обработки NoSuchElementException.
  4. Заменен Double.parseDouble(values1[1]);Integer.parseInt(values1[1]);, так как он генерировал 34.0, и вы хотели 34 в своем выходном файле.
+0

@vivekpatel, ваша проблема решена? –

+0

да, вы абсурдно правы со своей стороны..и проверено это работает..бат ... –

+0

, но я сделал небольшую ошибку, чтобы спросить мой запрос, я забыл упомянуть ... почему у меня было два раза inputStreamm.next(); потому что я хочу 2 значения в одно и то же время и выполняю некоторую математическую операцию на нем ... и сохраняю обратно к нему ... sry .. –

0

Значения bacause [1] и значение [2] имеют кавычки, вы должны String.replaceAll() кавычки.

0

я могу заметить различные проблемы:

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; 

Пахнет повторение мне.

EDIT: Я быстро выполнил одну программу, которая будет делать работу за вас:

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,. Вам нужно немного почистить, но это даст вам эту идею.

1

Когда вы читаете строки, он, видимо, возвращается с окружающими кавычки, как таковой:

"12,32,45,76" 

Итак, когда вы разделяете его, вы получаете следующие элементы:

"12 
32 
45 
76" 

Как вы можете см. первый и последний элементы в строке, не являются номерами, и поэтому ваш Double.ParseDouble (..) вызов завершается с ошибкой.

Вы должны либо изменить исходную строку (либо substringing его, или более предпочтительно, используя .reaplce («\»»,„“)) или проверить каждый элемент после раскола, а затем заменить/обрезки кавычку.