在java

时间:2017-11-04 03:43:45

标签: java csv arraylist

我是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)

Forth error>>>在AlgorithmTrader.ReadInputData(AlgorithmTrader.java:63)

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

上次错误>> SimpleAlgorithmTradingPlatform.main(SimpleAlgorithmTradingPl atform.java:15)

因此文件中的第一行有TIMESTAMP |关闭|高|低|打开|在这些行的每一行中,除了音量具有整数

之外,还有数字为double

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

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

另一个文件中的主要方法

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

2 个答案:

答案 0 :(得分:3)

你是否有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 :(得分:0)

很高兴看到您的CSV文件中的内容的虚构示例,但请为我们留下任何其他评论。 ;)

看起来您的错误(可能还有所有错误)很可能来自您的 Stock 类。这是另一个问题但是你的吸气者和制定者需要注意。有些人也不见了,但也许可以选择。

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

以下代码是一种方法:

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