Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как заставить игнорировать разделитель в кавычках, StringTokenizer 
V
    Опции темы
integral
Дата 15.8.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.7.2006
Где: Dnipropetrovs' ;k, Ukraine

Репутация: нет
Всего: нет



Хочу что бы StringTokenizer получал из строки "\"TYU\",\"sdf,123\"" две строки  TYU и  sdf,123
А он возращает 3 
Код

new StringTokenizer("\"TYU\",\"sdf,123\"", ",");

Как записать правильно? или может нуженг другой способ а не StringTokenizer?


--------------------
import my.opinion.*;
жж
PM ICQ   Вверх
alexadr
Дата 15.8.2008, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.9.2006

Репутация: 4
Всего: 4



Я так понимаю, что конечная задача написать парсер CSV файлов?! (это я сужу по тестовой строке в примере)
PM MAIL   Вверх
integral
Дата 15.8.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.7.2006
Где: Dnipropetrovs' ;k, Ukraine

Репутация: нет
Всего: нет



несовсем, нужно розпарсить одну тока строку в таком формате.
полазив по исходникам файлов, я нашел отличный парсер (мод. вариант):
Код

    private static String[] parseLine(String nextLine) throws IOException {
        char quotechar = '"';
        char separator = ',';
        if (nextLine == null) {
            return null;
        }
         
        ArrayList tokensOnThisLine = new ArrayList();
        StringBuffer sb = new StringBuffer();
        boolean inQuotes = false;
        do {
            if (inQuotes) {
                // continuing a quoted section, reappend newline
                sb.append("\n");
                nextLine = null;
                if (nextLine == null)
                 break;
                }
                for (int i = 0; i < nextLine.length(); i++) {
         
                char c = nextLine.charAt(i);
                if (c == quotechar) {
                // this gets complex... the quote may end a quoted block, or escape another quote.
                // do a 1-char lookahead:
                if( inQuotes  // we are in quotes, therefore there can be escaped quotes in here.
                     && nextLine.length() > (i+1)  // there is indeed another character to check.
                        && nextLine.charAt(i+1) == quotechar ){ // ..and that char. is a quote also.
                        // we have two quote chars in a row == one quote char, so consume them both and
                        // put one on the token. we do *not* exit the quoted text.
                         sb.append(nextLine.charAt(i+1));
                          i++;
                        }else{
                         inQuotes = !inQuotes;
                          // the tricky case of an embedded quote in the middle: a,bc"d"ef,g
                          if(i>2 //not on the begining of the line
                                  && nextLine.charAt(i-1) != separator //not at the begining of an escape sequence
                                  && nextLine.length()>(i+1) &&
                                  nextLine.charAt(i+1) != separator //not at the    end of an escape sequence
                          ){
                              sb.append(c);
                          }
                        }
                 } else if (c == separator && !inQuotes) {
                  tokensOnThisLine.add(sb.toString());
                  sb = new StringBuffer(); // start work on next token
                 } else {
                  sb.append(c);
                 }
            }
        } while (inQuotes);
        tokensOnThisLine.add(sb.toString());
        return (String[]) tokensOnThisLine.toArray(new String[0]);
    }


оригинал был взят с http://opencsv.svn.sourceforge.net/viewvc/...amp;view=markup

так что тема закрыта, спасиба


--------------------
import my.opinion.*;
жж
PM ICQ   Вверх
Ortega
Дата 18.8.2008, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 5.11.2005
Где: Харьков, Украина

Репутация: 4
Всего: 6



А не проще ли попробовать регулярку?
Код

        String source = "\"TYU\",\"sdf,123\"";
        String regex = "[^\",\"]+";
        Matcher m = Pattern.compile(regex).matcher(source);
        while(m.find()) {
            System.out.println(m.group());
        }

По-моему, так компактнее ;)
--------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1002 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.