【问题标题】:NumberFormatException when reading CSV file in java在 Java 中读取 CSV 文件时出现 NumberFormatException
【发布时间】:2017-11-04 03:43:45
【问题描述】:

我是 java 的初学者,有点陷入这两个问题,所以我正在尝试 让程序逐行读取 CSV 文件。

所以在文件中我有第一行作为字符串,列是双倍的。 所以问题是当它读取第一行时,它读取的标题是双倍的,它给了我一个错误。

顺便说一下是CSV文件

我得到的错误如下 线程“main”java.lang.NumberFormatException 中的异常:对于输入字符串:“CLOSE”这是第一个错误

第二个错误>>在 sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecima‌​l.java:1222) –

第三个错误>>在 java.lang.Double.parseDouble(Double.java:510)

第四个错误 >>> 在 AlgorithmTrader.ReadInputData(AlgorithmTrader.java:63)

第五个错误>>在 AlgorithmTrader.Run(AlgorithmTrader.java:16)

最后一个错误 >> SimpleAlgorithmTradingPlatform.main(SimpleAlgorithmTradingPl‌​atform.java:15)

所以文件的第一行有 TIMESTAMP |关闭 |高 |低 |开放|卷,在每一行下面都有双倍的数字,除了卷有整数

您的建议将不胜感激。谢谢

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;

public class AlgorithmTrader {

    public void Run() {

        ReadInputData();
    }

    public void ReadInputData() {

        // create object of scanner class for user input
        Scanner scan = new Scanner(System.in);
        // declare file name for input file
        String inputFileName = "";

        // input from user for input file
        System.out.print("Enter Input File Name: ");
        inputFileName = scan.nextLine();
        try {
            PrintWriter pw = new PrintWriter("output.csv");// to open the file

            // create a new file
            File file = new File(inputFileName);
            // create a new scanner object to read file
            Scanner readFile = new Scanner(file);

            // for each line data
            String line = "";

            line = readFile.nextLine();//skip the first line

            while (readFile.hasNextLine()) {

                readFile.nextLine();
                // pass file to scanner again
                readFile = new Scanner(file);

                ArrayList<String> list = new ArrayList<String>();

                // read stock data line by line

                while (readFile.hasNextLine()) {
                    // read line from file
                    line = readFile.nextLine();
                    // split line data into tokens
                    String result[] = line.split(",");

                    // variables to create a Stock object

                    String timestamp = result[0];
                    double close = Double.parseDouble(result[1]);
                    double high = Double.parseDouble(result[2]);
                    double low = Double.parseDouble(result[3]);
                    double open = Double.parseDouble(result[4]);
                    int volume = Integer.parseInt(result[5]);

                    // store data into ArrayList
                    list.add(readFile.next());
                    pw.print(list.add(readFile.next()));

                    Stock stock = new Stock(timestamp, close, high, low, open, volume);
                }// end of while to read file

                //close readFile object
                readFile.close();
                pw.close();//close file
            }
        } catch (FileNotFoundException e1) {

            System.out.println(" not found.\n");
            System.exit(0);
        } catch (IOException e2) {
            System.out.println("File can't be read\n");
        }
    }
}

我有另一个文件股票类

public class Stock {

    String timestamp;

    double close;
    double high;
    double low;
    double open;
    int volume;

    Stock(String t, double c, double h, double l, double o, int v) {
        timestamp = t;
        close = c;
        high = h;
        low = l;
        open = o;
        volume = v;
    }

    public void settimestamp(String t) {
        this.timestamp = t;
    }

    public void setclose(double c) {
        this.close = c;
    }

    public void sethigh(double h) {
        this.high = h;
    }

    public void setopen(double o) {
        this.open = o;
    }

    public void setvolume(int v) {
        this.volume = v;
    }

    public String gettimestamp() {
        return timestamp;
    }

    public double close() {
        return close;
    }

    public double high() {
        return high;
    }

    public int volume() {
        return volume;
    }
}

另外一个文件中的main方法也是如此

import java.text.DecimalFormat;

public class SimpleAlgorithmTradingPlatform {

    public static void main(String[] args) {

        DecimalFormat fmt = new DecimalFormat("#0.00"); // to get the      DecimalFormat

        AlgorithmTrader test = new AlgorithmTrader();

        test.Run();
    }
}

【问题讨论】:

  • 请将所有相关信息添加到问题中。不像 cmets
  • 我已经编辑过,希望你能理解我想要做什么谢谢
  • 检查代码中的这一行:AlgorithmTrader.ReadInputData(AlgorithmTrader.java:63) 第 63 行。
  • 就是这一行 / double close = Double.parseDouble(result[1]);
  • 我已经知道线路有问题但我不知道如何解决它!

标签: java csv arraylist


【解决方案1】:

你是因为这里有 NumberFormatException

line = readFile.nextLine();//skip the first line 

没有跳过第一行。 获取文件名后最好使用 BufferedReader 而不是 Scanner。我已经更正了你的代码。

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;

public class AlgorithmTrader {

    public void Run() {
        ReadInputData();
    }

    public void ReadInputData() {

        // create object of scanner class for user input
        Scanner scan = new Scanner(System.in);
        // declare file name for input file
        String inputFileName = "";

        // input from user for input file
        System.out.print("Enter Input File Name: ");
        inputFileName = scan.nextLine();

        // create a new file
        File csvFile = new File(inputFileName);
        String line;
        ArrayList<Stock> list = new ArrayList<>();

        try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {

            System.out.println("Reading file " + csvFile);

            System.out.println("Skipping title of the CSV file");
            // Skip first line because it is title
            br.readLine();

            System.out.println("Converting line to Stock");

            while ((line = br.readLine()) != null) {

                String result[] = line.split(",");
                String timestamp = result[0];
                double close = Double.parseDouble(result[1]);
                double high = Double.parseDouble(result[2]);
                double low = Double.parseDouble(result[3]);
                double open = Double.parseDouble(result[4]);
                int volume = Integer.parseInt(result[5]);

                list.add(new Stock(timestamp, close, high, low, open, volume));
            }

            System.out.println("Done");

        } catch (FileNotFoundException e1) {
            System.out.println(" not found.");
            System.exit(0);
        } catch (IOException e2) {
            System.out.println("File can't be read");
        }
    }
}

【讨论】:

  • 嘿,谢谢你的帮助,我收到一个错误说 >>> 对于低于 1.7 的源级别,此处不允许使用资源规范
  • @Abdoh 在这种情况下,您需要使用 java 1.8+ 或在没有资源的情况下使用 try catch 块,否则您需要手动关闭 BufferedReader。这是documentation
【解决方案2】:

很高兴在您的 CSV 文件中看到一个虚构的内容示例,但请不要给我们任何额外的 cmets。 ;)

看起来您的错误(可能是所有错误)最有可能来自您的 Stock 类。这是另一个已发布的问题,但是您的 getter 和 setter 需要注意。有些也不见了,但也许这是自愿的。

您应该能够使用一个 Scanner 对象和一个 while 循环来执行此任务。使用相同的 Scanner 对象进行用户输入和文件读取,无论如何它都会重新初始化。

下面的代码是一种方法:

ArrayList<String> list = new ArrayList<>();
// create object of scanner class for user input
// and File Reading.
Scanner scan = new Scanner(System.in);
// declare file name for input file
String inputFileName = "";
// input from User for input file name.
System.out.print("Enter Input File Name: ");
inputFileName = scan.nextLine();

String tableHeader = "";
try {
    // create a new file with PrintWriter in a 
    PrintWriter pw = new PrintWriter("output.csv"); 
    File file = new File(inputFileName);
    // Does the file to read exist?
    if (!file.exists()) {
        System.err.println("File Not Found!\n");
        System.exit(0);
    }   
    // create a new scanner object to read file
    scan = new Scanner(file);
    // for each line data
    String line = "";
    tableHeader = scan.nextLine();
    String newline = System.getProperty("line.separator");
    // Print the Table Header to our new file.
    pw.print(tableHeader + newline);

    while (scan.hasNextLine()) {
        line = scan.nextLine();
        // Make sure we don't deal with a blank line.
        if (line.equals("") || line.isEmpty()) {
            continue;
        }
        // split line data into a String Array.
        // Not sure if there is a space after 
        // comma delimiter or not but I'm guessing
        // there is. If not then remove the space.
        String result[] = line.split(", ");
        // variables to create a Stock object
        String timestamp = "";
        double close = 0.0;
        double high = 0.0;
        double low = 0.0;
        double open = 0.0;
        int volume = 0;

        // Make sure there are enough array elements 
        // from our split string to fullfil all our 
        // variables. Maybe some data is missing.
        int resLen = result.length;
        if (resLen > 0) {
            if (resLen >= 1) { timestamp = result[0]; }
            if (resLen >= 2) { close = Double.parseDouble(result[1]); }
            if (resLen >= 3) { high = Double.parseDouble(result[2]); }
            if (resLen >= 4) { low = Double.parseDouble(result[3]); }
            if (resLen >= 5) { open = Double.parseDouble(result[4]); }
            if (resLen >= 6) { volume = Integer.parseInt(result[5]); }
        }
        // store data into ArrayList.
        // Convert the result Array to a decent readable string.
        String resString = Arrays.toString(result).replace("[", "").replace("]", "");
        list.add(resString);
        // Print the string to our output.csv file.
        pw.print(resString + System.getProperty("line.separator"));

        //Stock stock = new Stock(timestamp, close, high, low, open, volume);
    }   
    //close file
    scan.close();
    pw.close();
} 
catch (IOException ex ){
    System.err.println("Can Not Read File!\n" + ex.getMessage() + "\n");
    System.exit(0);
}

// Example to show that the ArrayList actually 
// contains something....
// Print data to Console Window.
tableHeader = tableHeader.replace(" | ", "\t");
tableHeader = "\n" + tableHeader.substring(0, 10) + "\t" + tableHeader.substring(10);
System.out.println(tableHeader);
for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i).replace(", ", "\t"));
}

【讨论】:

  • 嘿,谢谢你的帮助,我收到一个错误说 >>> 对于低于 1.7 的源级别,此处不允许使用资源规范
  • 我更改了代码以适应您的 JDK 版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2018-12-26
相关资源
最近更新 更多