foo.split (','). length! = количество ',' найденных в 'foo'? - PullRequest
2 голосов
/ 25 сентября 2010

Возможно, это потому, что в пятницу конец дня, и я уже нашел обходной путь, но это убивает меня.

Я использую Java, но являюсь разработчиком .NET.

У меня есть строка, и мне нужно разделить ее на точка с запятой запятая. Допустим, это строка в CSV-файле, которая имеет 200 210 столбцов. line.split (','). length будет иногда, 199, где count ',' будет 208 ИЛИ 209. Я нахожу count двумя разными способами, даже чтобы быть уверенным (используя регулярное выражение, затем вручную перебирая и проверяя персонаж после потери моего здравомыслия).

Что мне здесь не хватает, так сказать, супер-очевидный удар по лицу на столе? Почему foo.split (delim) .length == CountOfOccurences (foo, delim) все время, только иногда?

большое спасибо

Ответы [ 5 ]

8 голосов
/ 25 сентября 2010

Происходит пара вещей. Во-первых, если у вас есть три элемента, такие как a, b, c и разделенные запятой, у вас будет три записи, на одну больше, чем число запятых.

Но то, с чем вы имеете дело, вероятно, происходит от последовательных разделителей. : a ,,,, b, c ,,,,,

Те, что в конце, выпадают. Проверьте документацию Java для функции split. http://download.java.net/jdk7/docs/api/java/lang/String.html

8 голосов
/ 25 сентября 2010

Во-первых, есть одно очевидное отличие. Если есть 200 столбцов, все с текстом, то есть 199 запятых. Во-вторых, Java по умолчанию отбрасывает завершающие пустые строки. Вы можете изменить это, передав отрицательное число в качестве второго аргумента.

"foo,,bar,baz,,".split(",")

есть:

{foo,,bar,baz}

массив из 4 элементов. Но

"foo,,bar,baz,,".split(",", -1)

есть ::

{foo,,bar,baz,,}

со всеми 6.

Обратите внимание, что по умолчанию отбрасываются только завершающие пустые строки.

Наконец, не забывайте, что String компилируется в регулярное выражение. Это не применимо здесь, так как , не является специальным символом, но вы должны помнить об этом.

1 голос
/ 25 сентября 2010

Как уже отмечали другие, String.split имеет не очень интуитивное поведение.

Если вы используете библиотеку Java с открытым исходным кодом Guava от Google , есть Splitter класс, который дает гораздо более хороший (на мой взгляд) API для этого, с большей гибкостью:

String input = "foo, bar,";

Splitter.on(',').split(input);
// returns "foo", " bar", ""

Splitter.on(',').omitEmptyStrings().split(input);
// returns "foo", " bar"

Splitter.on(',').omitEmptyStrings().trimResults().split(input);
// returns "foo", "bar"
0 голосов
/ 25 сентября 2010

Это пропуски пробелов?

У вас есть что-то вроде "a, b, c ,, d, e" или конечные разделители типа "a, b, c ,,,,"?

Есть ли в данных ячейки дополнительные разделители?

0 голосов
/ 25 сентября 2010

Краткий пример: foo = "1,2" и

foo.split(",").length = 2
 count(foo, ",") = 1

Возможно, в вашем коде есть ошибка.Вот пример в коде Java:

       String row = "1,2,3,4,,5"; //  second example: 1,2,3,5,,    
         System.out.println(row.split(",").length); // print 6 in both cases


       // code to count how many , you have in your row
       Pattern patter = Pattern.compile(",");
       Matcher m = patter.matcher(row);


       int nr = 0;
       while(m.find())
       {
                  nr++;

       }
       System.out.println(nr); // print 5 for the first example and 6 for second
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...