4

私は Java 初心者であり、このサイトを初めて使用するので、ご容赦ください。これを投稿する際に何か間違ったことをした場合はお知らせください。私がしたことや悪い文法について事前に謝罪します.

引用符内のコンマを区切らないカスタム CSV パーサーを Java で作成する必要があります。CSV クラスに関連するものは使用できません。1,2,3,4 -> 1 2 3 4 a,"b,c",d -> ab,cd

何を試しても、常に例外が発生します

import java.io.*;
import java.util.*;

public class csv
{
    public static void main(String[] args)
    {
        File file = new File("csv.test");
        BufferedReader buf = null;

        try
        {
            buf = new BufferedReader(new FileReader(file));

            String str;

            while ((str = buf.readLine()) != null)
            {
                String[] values = null; // array for saving each split substr
                int c1 = 0; // counter for current position in string
                int c2 = 0; // counter for next space in array to save substr
                int c3 = 0; // location of last comma or quotation for substring creation
                int i = 0; // counter used later for printing

                while (c1 <= str.length())
                {
                    char x = str.charAt(c1);
                    String s = Character.toString(x);

                    if (c1 == str.length())
                    {
                        values[c2] = str.substring(c3, (c1 - 1));
                    }
                    else if (s == ",")
                    {
                        values[c2] = str.substring(c3, (c1 - 1));
                        c1++;
                        c2++;
                        c3++;
                    }
                    else if (s == "\"")
                    {
                        c1++;
                        c3 = c1;
                        while (s != "\"")
                            c1++;
                        values[c2] = str.substring(c3, (c1 - 1));
                        c1 = c1 + 2;
                        c2++;
                        c3 = c1;
                    }
                    else
                    {
                        c1++;
                    }
                    while (i < values.length)
                        System.out.println("\"" + values[i] + "\"");
                }
            }
        }
        catch (Exception e)
        {
            System.out.println("Error locating test file");
        }
    }
}

すべてのロジックを切り取り、ファイル io 関連かどうかをテストしてみました。それは問題なく読めるので、ロジックに関連しているということになります。私はそれを見て、それで何か悪いことを見つけることができません. 友達にも見てもらいましたが、見た目はいいとのことでした。スローされた例外はどこにありますか?

4

3 に答える 3

3

valuesこの行であなたを初期化していないString[] values = null;ので、それを使用すると失敗します。つまり、 listvalues[c2] = str.substring(c3, (c1 - 1));です。

この問題を解決するには、values配列を適切な長さで初期化してくださいString[] values = new String[SIZE];。おそらく、配列のstr.length()時点で使用する必要があります。SIZE

また、あなたの比較else if (s == ",")では、 String を使用して比較していますが==、これは正しくありません。x代わりに、それ自体を として使用できますelse if (x == ',')

編集:c1どこの値も変更していないため、以下の条件は無期限に増加しますstr(x after correction as advised)

古い状態:

             while (s != "\"")
                  c1++;

アドバイスどおりに変更した後 (x が while ループ内で変更されていないため、まだ間違っています):

             while (x != '"')
                  c1++;

ループロジックを修正してください。

于 2012-11-19T03:14:11.347 に答える
1

具体的な問題とは関係ありませんが、 の代わりにs == ","を実行する必要があります",".equals(s)。これは、他の文字列の等価性チェックと同様です。

于 2012-11-19T03:15:38.600 に答える
0

これは例外の原因ではありませんが、それでも明らかに正しくありません。

    while (s != "\"")
        c1++;

これは次の 2 つの理由で正しくありません。

  • c1++ループ条件を変更しないため、これは永久にループします。
  • を使用する必要があるときに、==/を使用して文字列を比較しています。あなたは他の場所でもこの間違いを犯したようです。!=equals(...)

例外の原因を突き止めるには、最初にスタックトレースを出力する必要があります。e.printStackTrace();catch ブロック に追加します。

または、さらに良いことに、単に catch に変更しIOExceptionます。キャッチExceptionは悪い考えです...完全なスタックトレースをログ/出力する場合を除きます。

于 2012-11-19T03:19:34.177 に答える