2

CSV ファイルを単純に読み取り、ファイルからデータを保存するメソッドを作成しようとしています。読み込もうとしている CSV ファイルのスクリーンショットと、このメソッドのコードへのリンクを次に示します。

http://i.imgur.com/jsGTg.png

public static void correctPrices(String correctfile) {

    String data;
    Date date;
    SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");

    File correctedfile = new File(correctfile);
    Scanner correct;

    try {

        correct = new Scanner(correctedfile);

        correct.nextLine(); //to avoid reading the heading
        ArrayList<Date> correctdate = new ArrayList<Date>();
        ArrayList<String> correctdata = new ArrayList<String>();

        while (correct.hasNext()) {

            correctdata.add(correct.nextLine());
            //data = correct.nextLine();
            //String[] corrected = correct.nextLine().split(",");
            //date = formatter.parse(corrected[0]);
            //correctdate.add(date);

        }

        for (int i = 0; i < correctdata.size(); i++) {

            System.out.println(correctdata.get(i));

        }

    } 

    catch (FileNotFoundException ex) {

        Logger.getLogger(DataHandler.class.getName()).log(Level.SEVERE, null, ex);

    }        

}

予想どおり、このコードはファイルの最後の 2 行を出力します。ただし、コメントを外すと data = correct. nextLine(); while ループでは、出力は CSV の 2 行目のみを返し、最後の行は返しません。私はこれに少し困惑していますか?私がやろうとしたことは、その行を別の変数に格納することだけでしたが、最後の行が省略されるのはなぜですか? ご協力いただきありがとうございます。追加情報が必要な場合はお知らせください。

4

1 に答える 1

2

問題は、 を呼び出すとcorrect.nextLine()、行が読み取られ、ファイル内の読み取り先へのポインターがインクリメントされることです。ループ内でそれを複数回呼び出すため、ポインターを複数回インクリメントし、行をスキップします。あなたがすべきことは、whileループの最初で、行を一度読むだけです

data = correct.nextLine();

そしてcorrect.nextLine()、ループに現れる他のすべての場所を に置き換えますdata

言い換えれば、あなたのwhileループは次のようになります

while (correct.hasNext())
{
    data = correct.nextLine();
    correctdata.add(data);
    String[] corrected = data.split(",");
    date = formatter.parse(corrected[0]);
    correctdate.add(date);
}
于 2012-07-02T19:55:22.190 に答える