2015-05-15 2 views
0

Я работаю с CSV-файлом, и я хочу извлечь два значения в определенных положениях из каждой строки.Получение двух consicutive значений из файла в java

Входной файл 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 

Например, я хочу два последовательных значения с 3-й позиции (колонка с) из каждой строки в то же время, так что (45, 77), (49, 26), (77, ???) ...

После получения этих двух значений, я хочу сделать некоторые вычисления на них и сохранить их обратно. Я работаю над умножением матрицы размера [] 2X1. по этой причине мне нужно два последовательных значения за раз.

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

     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()) { 
       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[2]); 


/*NoSuchElementException*/String data1 = inputStreamm.next(); //read comming nextline for second value and store in data1 
       String[] values1 = data1.split(","); 
       //inputStream.next();   
       double second = Double.parseDouble(values1[2]); 

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

я получаю сообщение об ошибке, как nosuchelement исключение при упоминании в моем коде ...

+0

Всегда отправлять точное сообщение об ошибке с информацией о какой линии он происходит, а не «ошибка как ...» –

+0

Исключение в потоке «основной» java.util.NoSuchElementException на java.util.Scanner.throwFor (Scanner.java:906) на java.util.Scanner.next (Scanner.java:1415) на javaapplication55.JavaApplication55.main (JavaApplication55.java:69), о чем я упоминаю в своем коде в строке комментария. –

ответ

0

Я решил проблему с помощью BufferedReader вместо сканера, чтобы прочитать ДАННЫЕ. Поскольку ваш код пытается прочитать всю строку через сканер, а затем разбить его, вы можете сделать это гораздо проще, используя BufferedReader и называя его метод readLine().

Таким образом, изменения, внесенные в ваш код, являются просто заменой использования сканера с помощью BufferedReader. Я не проверил вычисления, но мне кажется, что он работает нормально.

Вот образ результата, который я получаю:

result of computations

Кроме того, поскольку ваш цикл в то время как на основе сканера я изменил, что too.The в то время как цикл, который я использую проверки, что обе линии не нулевой (чтение их в то же время состояние в то время как в настоящее время оценивается)

последний пункт относительно вашего кода является то, что на BufferedWriter у вас есть newLine() метод, который вставляет переносной эквивалент линии Skeep (в \n в вашей код)

Вот код. Выполните его и убедитесь, что он работает нормально.

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

     File file = new File(filename); 
     BufferedWriter writer = null; 
     BufferedReader reader = null; 

     try { 

      reader = new BufferedReader(new FileReader(file)); 
      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;   

      String line1= null; 
      String line2 = null; 
      // Skeeps the head line 
      reader.readLine(); 

      String currentLine = null; 

      while ( ((line1 = reader.readLine())!= null) && ((line2 =  reader.readLine()) != null)  ) { 

       String[] values = line1.split(","); 

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

       String[] values1 = line2.split(","); 

       double second = Double.parseDouble(values1[2]); 

       c1 = ((a2 * second) + (a1 * first)); 
       c2 = ((a3 * first) + (a4 * second)); 
       values1[2] = String.valueOf(c2); 
       values[2] = String.valueOf(c1); 
       StringBuilder sb = new StringBuilder(); 

       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(","); 
        } 
       } 

       writer.write(sb.toString()); 
       writer.newLine(); 
      } 
      writer.flush(); 
      writer.close(); 
      reader.close(); 

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

Ваш код выполняет следующие действия:

inputStream.next(); 
while (inputStreamm.hasNext()) {    
    inputStreamm.next(); 
    ... 
    inputStreamm.next(); 
    ... 
} 

Что означает, что он будет выполнять нечетное количество считываний (2*n + 1). Но ваш вход явно состоит из четного количества данных. Вот почему вы получаете исключение.

Непонятно, как вы хотите обработать случай (77, ???), но для его обнаружения вы должны снова позвонить hasNext() в цикле.

inputStream.next(); 
while (inputStreamm.hasNext()) {    
    inputStreamm.next(); 
    ... 
    if(inputStreamm.hasNext()) 
     inputStreamm.next(); 
     ... 
    else 
     //take care of special case 
    ... 
} 
Смежные вопросы