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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с выборкой 
V
    Опции темы
344092
Дата 16.7.2006, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброе время суток, помогите начинающему организовать процесс.

Есть сообщения, которые приходят посредством Сокета, они читаются построчно "сообщения разделены пробелами" и возвращаются.
Как сделать лучьше с этим кодом, что бы строки ещё и анализировать.т.е

Вот строка, имеет вид:

      /06-07-15/16-15-41 HO BTR5+30  PC:Y     210
  SYST = 40     ATA = 4                                 ST = ON
     ---------------- п р о б е л -----------------------------
     /06-07-15/16-15-41 HO BTR5+30  PC:Y     210
  SYST = 231     ATA = 4                                 ST = ON

Надо анализаровать только 2-ю строчку и вот эту часть "SYST = 40 может быть и не 40 а 231 и т.п"
Так вот если там "40" то System.out.println("ERROR"), а если "231" то System.out.println("OK").
Строчки бывают разной длины и ширины, а ещё постоянно дополняются новыми.

      ВОТ код которым я читаю просто все строчки без анализа.
Код

package messages;

import java.util.Calendar;

import messages.Message;
import messages;

public class implements IMessage {

    private Message message;
    private String[] messageRows;
    
    public Message parse(String messageText) {
        messageRows = messageText.split("\n");
        message = new Message();
        message.setText(messageText.trim());
        message.setDateTime(Calendar.getInstance().getTime());
        message.setSummary(messageRows[0].trim());
        return message;
    }

}


Может лучьше создать txt файл где будет описанно если SYST = 40 то ето если SYST = 321 то то.???
Только вопрос КАК???И каким способом, может что то по другому.

Заранее огромное СПАСИБО.

 
PM MAIL   Вверх
LSD
Дата 16.7.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Честно говоря, трудно понять этот "поток сознания", хотелось бы более четкого описания проблемы. В частности, нормальное описание формата входных данных, типа:
Цитата
Данные поступают блоками, каждый блок заканчивается символом перевода строки. Внутри блока группы данны разделяются пробелом. Группа данных, состоит из:...

потому как сейчас вообще нефига не понятно:
Цитата(344092 @  16.7.2006,  17:36 Найти цитируемый пост)
они читаются построчно "сообщения разделены пробелами"

так, чем разделены сообщения, пробелом или символом перевода строки?
Потом:
Цитата(344092 @  16.7.2006,  17:36 Найти цитируемый пост)
Строчки бывают разной длины и ширины, а ещё постоянно дополняются новыми.

т.е. формат строки не фиксирован, или как?

Цитата(344092 @  16.7.2006,  17:36 Найти цитируемый пост)
ВОТ код которым я читаю просто все строчки без анализа.

Если уж приводишь код, то хотелось бы работоспособный код, а не какой-то набросок. Иначе зачем его приводить. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Maksym
Дата 17.7.2006, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

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



344092
Береш вторую строчку и проверяешь, что там на интересующей тебя позиции... У класса String есть все необходимые методы... для более сложного анализа допускает использование регулярных выражений..
В общем, поставь, пожалуйста, вопрос яснее.. 
PM MAIL   Вверх
344092
Дата 17.7.2006, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Тогда проще и яснее. Я немного изменю вопрос.

пусть есть тхт файл в котором с внешнего источника "как бы создаётся журнал,лог и тд"  в него постоянно добовляются данные вот в такой форме


      
   /06-07-15/16-15-41 HO BTR5+30  PC:Y     110
  SYST = 40     ATA = 4                                 ST = ON
     
  /06-07-15/16-15-41 HO BTR5+30  PC:G     510
  SYST = 231     STA = 48                              ST = OFF

  /06-07-15/16-15-41 HO BTR5+30  PC:G     213
  SYST = 231     STA = 400                            ST = OFF



Интересует только строчка "SYST = XXX" где ХХХ- разное число

Задача:

1) читать файл при поступлении в него нового сообщения "не читать весь а только новое поступившее"
2) анализировать 2-ую строчку "точнее "SYST = XXX" и если число в 

"SYST = 1" тогда system.out.println("Warning")
если
"SYST = 4" тогда system.out.println("Error !!!")

3) Чисел т.е "xxx"  много и к каждой надо свой system.out.println("")

Как реализовать данный процесс??? Буду очень благодарен smile 




 
PM MAIL   Вверх
LSD
Дата 17.7.2006, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



1. Составить регулярное выражение, которое бы описывало эту конструкцию. Что то типа:
Код
.*\n\s*SYST\s*=\s*(\d+).*

2. Читать данные построчно, во второй строке искать строку SYST = , после чего выделить все цифры которые за этим следуют.

Первый способ универсальней, второй быстрей.  


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
344092
Дата 21.7.2006, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Что то не выходит    smile  
PM MAIL   Вверх
LSD
Дата 21.7.2006, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(344092 @  21.7.2006,  20:41 Найти цитируемый пост)
Что то не выходит

Значит, что то неправильно делаешь. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
344092
Дата 22.7.2006, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



сделал так НО как переделать на регулярные выражения так будет конечно проще, ни как не могу догнать smile 

Код

public class Parse { 

    public static void main(String[] args) { 
        String input = "!!! /06-07-16/21-18-41 RO JT8U+60 BC:B 304\n" 
                       + "INFO = 50 HEROPAGRT AUUTO RC\n" 
                       + "INFO = 130 HEROPAGRT AUUTO RC\n" 
                       + "!! /06-07-16/21-18-41 RO JT8U+60 BC:B 304\n" 
                       + "INFO = 00000001 + 00000001 + 00002000\n" 
                       + "INFO = 23 HEROPAGRT AUUTO RC\n" 
                       + "INFO = 83 HEROPAGRT AUUTO RC\n" 
                       + "! /06-07-16/21-18-41 RO JT8U+60 BC:B 304\n" 
                       + "INFO = 00000001 + 00000001 + 00002000\n"; 
        BufferedReader source = new BufferedReader(new StringReader(input)); 
        try { 
            String str = null; 
            // Эмулируем чтение построчно 
            while ((str = source.readLine()) != null) { 
                System.out.println("Processing string: " + str); 
                
                // Строка первого типа ? 
                if (str.startsWith("!")) { 
                    String tempStr = str; 
                    // Ищем первый пробел в первой строке 
                    int pos = tempStr.indexOf(" "); 
                    String level = tempStr.substring(0, pos); 
                    System.out.println("Level: [" + level + "]"); 
                    // Количесво !!! 
                    int count = level.length(); 
                    System.out.println("Count: [" + count + "]"); 

                    // Отрезаем обработанный кусок 
                    tempStr = tempStr.substring(pos+1); 

                    // Ищем дату 
                    String date = tempStr.substring(0, tempStr.indexOf(" ")); 
                    System.out.println("Date: [" + date + "]"); 

                // Строка второго типа ? 
                // ( Я не знаю как быть с плюсами в третей строке нужно только вот это 00000001 + 00000001 + 00002000) 
                // Ищем строку без плюсов 
                } else if (str.startsWith("INFO") && str.indexOf("+") == -1) { 
                    String tempStr = str; 
                    // Убираем все до числа "INFO = " 
                    tempStr = tempStr.substring(tempStr.indexOf("=") + 2); 
                    String value = tempStr.substring(0, tempStr.indexOf(" ")); 
                    System.out.println("Value: [" + value + "]"); 
                } 
            } 
        } catch (Exception ex) { 
            ex.printStackTrace(); 
        } 
    } 
}
 
PM MAIL   Вверх
344092
Дата 22.7.2006, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Объясните пожалуйста как переделатьтак:

есть строка, положение одно и тоже вот она (оригинал)

 !!   /05-01-15/00-05-05 ЕР IFH56HY  GC:A     195
 INFO = 367                    DEPASSEMENT SEUIL YTY
      NTNE = 51


в строке интересует 3 вещи   вот это (!!) кстати может быть и (!) и так (!!!) т.е 3 вида на которые надо сделать то же самое что (см.ниже)
Вырезать Дату /05-01-15/00-05-05 после слова EP в данной строке ничего не надо
и главное цифра после INFO = xxx которую как то надо обработать, т.е их может быть много напр. если цифра 367 как в сообщении
то сделать к примеру System.out.rpintln("Ошибка ввода") если цифра 23 то System.out.rpintln("Перегрузка")

В общем вопрос такой, как обработать в строке много,разных значений и к каждому присвоить что то вроде System.out.rpintln ("-в зависемости от цифры в INFO-")

Заранее благодарю, и если не трудно то подробно хотя бы в какую сторону мне рулить... smile 

 
PM MAIL   Вверх
LSD
Дата 22.7.2006, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Если ты можешь сразу считать, сразу все 3 строки, то можно обойтись и одним регулярным выражением, если нет, то надо составить 2 регулярки.
Код
import java.io.*;
import java.util.regex.*;

public class Parse
{

  public static void main(String[] args)
  {
    String input = "!!! /06-07-16/21-18-41 RO JT8U+60 BC:B 304\n"
        + "INFO = 50 HEROPAGRT AUUTO RC\n"
        + "INFO = 130 HEROPAGRT AUUTO RC\n"
        + "!! /06-07-16/21-18-41 RO JT8U+60 BC:B 304\n"
        + "INFO = 00000001 + 00000001 + 00002000\n"
        + "INFO = 23 HEROPAGRT AUUTO RC\n"
        + "INFO = 83 HEROPAGRT AUUTO RC\n"
        + "! /06-07-16/21-18-41 RO JT8U+60 BC:B 304\n"
        + "INFO = 00000001 + 00000001 + 00002000\n";
    Pattern str1Pattern = Pattern.compile("^!{1,3}\\s*(/\\d{2}-\\d{2}-\\d{2}/\\d{2}-\\d{2}-\\d{2}).*$");
    Pattern str2Pattern = Pattern.compile("^\\s*INFO\\s*=\\s*(\\d+).*$");

    BufferedReader source = new BufferedReader(new StringReader(input));
    try
    {
      String str;
      while((str = source.readLine()) != null)
      {
        System.out.println("Processing string: " + str);

        Matcher str1Matcher = str1Pattern.matcher(str);
        if(str1Matcher.matches())
        {
          System.out.println(str1Matcher.group(1));
        }
        else
        {
          Matcher str2Matcher = str2Pattern.matcher(str);
          if(str2Matcher.matches())
            System.out.println(str2Matcher.group(1));
        }
      }
    }
    catch(Exception ex)
    {
      ex.printStackTrace();
    }
  }
}
 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
344092
Дата 22.7.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Огромное спасибо, работает!

А как вырезать строку с позиции  (на примере моего кода без регулярных, просто хочу разобраться как вырезать позиции и направлять их)

Код

!!! /06-07-16/21-18-41 RO JT8U+60 BC:B 304



вырезать нужно ВС:В и направить в 

Код

System.out.println("Value: [" + value + "]"); 


 
PM MAIL   Вверх
LSD
Дата 22.7.2006, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Код
String s = "!!! /06-07-16/21-18-41 RO JT8U+60 BC:B 304";
System.out.println(s.substring(s.indexOf("BC:")));
 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Tony
Дата 22.7.2006, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

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



Посмотри класс StringTokenizer 


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
344092
Дата 23.7.2006, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Огромное спасибо LSD, всё заработало на ура. Осталось последнее 

// Строка первого типа ? 
if (str.startsWith("!")) { 
String tempStr = str; 
// Ищем первый пробел в первой строке 
int pos = tempStr.indexOf(" "); 
String level = tempStr.substring(0, pos); 
System.out.println("Level: [" + level + "]"); 

Не могу создать switch: 

для выбора ! или !! или !!! символа, т.к им тоже надо 3-и разных параметра " пример ! внимание, !!- особое внимание !!!- всё кина не будет" 

Да и switch: символы ! !! !!! не понимает только цыфры??? Их наверное заменять надо или всё же нет? 
PM MAIL   Вверх
Maksym
Дата 23.7.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

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



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

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

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


 




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


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

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