【问题标题】:Read streamfile in java在java中读取流文件
【发布时间】:2015-07-25 14:45:36
【问题描述】:

我正在处理逗号分隔值文件。我想从每个原始值中提取第一个位置[“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] 中..为什么我无法理解请帮助我...

【问题讨论】:

  • 线程“main”中的异常 java.lang.NumberFormatException: For input string: ""12" 正如您在 csv 文件中看到的那样,在 12 号之前有一个额外的引号
  • @SercanOzdemir 我在操作的 csv 中没有看到任何引用?你能说他们在哪里吗?
  • 输入文件(bank-full2)中没有类似“”的引号...
  • 当我读取另一个文件时..它给了我类似“线程“main”java.util.NoSuchElementException中的异常”之类的错误,但文件绝对没问题..在它抛出的代码中提到错误。
  • 在您的while 循环中,您正在检查inputStreamm.hasNext(),但在循环内您调用inputStreamm.next() 两次,这将导致java.util.NoSuchElementException,当最后一行已经被第一个inputStreamm.next() 读取时第二个inputStreamm.next() 被调用

标签: java file csv filestream filereader


【解决方案1】:

当您阅读该行时,它显然会返回并带有引号,例如:

"12,32,45,76"

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

"12
32
45
76"

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

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

【讨论】:

    【解决方案2】:

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

    我重写了你的代码,它正在工作:

    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

    【讨论】:

    • 但我在询问我的查询时犯了一个小错误,我忘了提及......为什么我使用了两次 inputStreamm.next();因为我想要同时 2 个值并做一些数学运算对其进行操作...并存储回它...sry..
    • 我编辑了我的代码请检查..这就是为什么我需要同时需要 2 个值.. 早些时候我为了数学简化做了一些增量步骤......但我认为这不是有效的方法问..
    • @vivekpatel,你可以这样划分你的代码。 1.读取文件并将值存储在二维数组中。 2. 使用该二维数组进行计算并准备结果。 3. 将结果写入文件。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我可以注意到各种问题:

       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,。你需要做一些清理工作,但它会给你这个想法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-29
        • 2012-05-03
        • 2017-11-12
        • 1970-01-01
        • 2020-03-21
        • 2021-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多