簡體   English   中英

在Java中讀取CSV文件時出現NumberFormatException

[英]NumberFormatException when reading CSV file in java

我是Java的初學者,有點卡在這兩個問題中,所以我試圖讓程序逐行從CSV文件讀取。

因此,在文件中,第一行為String,列為double。 所以問題是當它讀取第一行時,它正在讀取標題為雙精度的字,這給了我一個錯誤。

順便是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)上出現第四次錯誤>>>

第五錯誤>> at AlgorithmTrader.Run(AlgorithmTrader.java:16)

最后一個錯誤>> SimpleAlgorithmTradingPlatform.main(SimpleAlgorithmTradingPlatform.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();
    }
}

您遇到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");
        }
    }
}

很高興看到CSV文件中內容的虛構示例,但請不要給我們其他任何注釋。 ;)

看來您的錯誤(可能是所有錯誤)最有可能來自您的股票類別。 這是另一個發布的問題,但是您的獲取者和安裝者需要注意。 一些也丟失了,但是也許這是選擇。

您應該能夠使用一個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"));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM