1
String[] values = line.split(",");

Long locId = Long.parseLong(replaceQuotes(values[0]));
String country = replaceQuotes(values[1]);
String region = replaceQuotes(values[2]);
String city = replaceQuotes(values[3]);
String postalCode = replaceQuotes(values[4]);
String latitude = replaceQuotes(values[5]);
String longitude = replaceQuotes(values[6]);
String metroCode = replaceQuotes(values[7]);
String areaCode = replaceQuotes(values[8]);

//...

public String replaceQuotes(String txt){
    txt = txt.replaceAll("\"", "");
    return txt;
}

上記のコードを使用して、次の形式のデータで CSV を解析しています。

828,"US","IL","Melrose Park","60160",41.9050,-87.8641,602,708

ただし、次のようなデータ行に遭遇すると、java.lang.ArrayIndexOutOfBoundsException: 7

1,"O1","","","",0.0000,0.0000,,

これは、 の値にアクセスしようとするたびにvalues[7]例外がスローされるということですか?

もしそうなら、テキスト行のその位置にデータを含まない行を解析するにはどうすればよいですか?

4

2 に答える 2

6

まず第一に、String.split()は優れた CSV パーサーではありません。引用符を認識せず、引用符で囲まれた値の 1 つにコンマが含まれるとすぐに混乱します。

そうは言っても、デフォルトでString.split()は空の後続要素が除外されます。引数が 2 つのバリアントを使用することで、これに影響を与えることができます。

String[] values = line.split(",", -1);
  • -1(または任意の負の値) は、配列が必要なだけ大きくなることを意味します。
  • 正の値を使用すると、実行される分割の最大量が得られます (それを超えると、カンマが含まれていても、すべて単一の値になります)。
  • 0(引数が 1 つの値を使用する場合のデフォルト) は、配列が必要なだけ大きくなることを意味しますが、末尾の値空の場合は配列から除外されます (実際に発生した場合とまったく同じです)。
于 2011-07-05T11:32:11.710 に答える
1

原則として、動作するパーサーが既に存在する場合は、独自の (欠陥のある) パーサーを決してハックしてはなりません。CSV を正しく解析するのは容易ではなく、String.split は機能しません。CSV はセパレーターとして機能せず,に 間で使用できるため"です。

OpenCSVの使用を検討してください。これにより、現在抱えている問題と、ユーザーが をデータの一部として使用するときに直面する問題の両方が解決さ,れます。

于 2011-07-05T11:39:23.363 に答える