Как избежать срабатывания ArrayIndexOutOfBoundsException при разборе пустых позиций в строке CSV? - PullRequest
1 голос
/ 05 июля 2011
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], будет выдано исключение?

Если это так, как мне разобрать строки, которые не содержат данных в этой позиции текстовой строки?

Ответы [ 2 ]

6 голосов
/ 05 июля 2011

Прежде всего, String.split() не является отличным парсером CSV: он не знает о кавычках и испортится, как только одно из ваших значений в кавычках будет содержать запятую.

Как говорится,по умолчанию String.split() пропускает пустые конечные элементы.Вы можете повлиять на это, используя вариант с двумя аргументами :

String[] values = line.split(",", -1);
  • -1 (или любое отрицательное значение) означает, что массив будет настолько большим, насколько это необходимо.
  • Использование положительного значения дает максимальное количество разбиений, которое должно быть сделано (это означает, что все, что находится за этим, будет одним значением, даже если оно содержит запятую).
  • 0 (значение по умолчанию, если вы используете значение с одним аргументом) означает, что массив будет настолько большим, насколько это необходимо, , но пустые конечные значения будут исключены из массива (именно так, как это происходит с вами).
1 голос
/ 05 июля 2011

Как правило, вы никогда не должны взламывать свой собственный (неисправный) парсер, если рабочий уже существует. CSV не легко разобрать правильно, и String.split не будет выполнять эту работу, поскольку CSV позволяет использовать , между ", не работая в качестве разделителей.

Рассмотрите возможность использования OpenCSV . Это решит как проблему, с которой вы сейчас столкнулись, так и проблему, с которой вы столкнетесь, когда пользователь использует , как часть данных.

...