Разбор повторяющихся групп из строки - PullRequest
0 голосов
/ 05 июля 2011

Я сейчас беру строку, которая делится

20004=1~^20005=0~^773=~^665=~^453=3~^448=0A~!447=D~!452=1~!~^448=0A~!447=D~!452=17~!~^448=81~!447=D~!452=7~!~^11=1116744Pq2Q~^70=15040024-1~^793=MNL-?--1~^467=37878024-1~^60=20110617-05:57:31~^75=20110616~^768=1~^769=20110616-19:17:00~!770=1~!~^55=7800950~^48=AEP~^22=~^454=0~^460=5~^167=TCKR~^

Структура строки такова, что ~ ^ разделяет атрибуты и ~! отмечает группы. Группам предшествует атрибут, который сообщает количество повторяющихся групп, например

453=3~^448=0A~!447=D~!452=1~!~^448=0A~!447=D~!452=17~!~^448=81~!447=D~!452=7~!~^

Где тег 453 обозначает, что есть 3 группы.

Я использовал такой синтаксический анализ:

    public Map<Integer, Object> parse(Object target)
{
    String[] elements = ((String) target).split(elementDilimiter);

    Map<Integer, Object> targetFields = new LinkedHashMap<Integer, Object>();

    for(int i=0; i<elements.length; i++)
    {
        String[] attributes = elements[i].split(attributeDelimiter);


        if(attributes.length != 2 || attributes[0].length() == 0 || attributes[1].length() == 0)
        {
            /*throw new ParsingException("Malformed element: " + element + ", expected: tag=value");*/
            continue;
        }
            targetFields.put(Integer.valueOf(attributes[0]), attributes[1]);
    }
    return targetFields;
}

Разделитель элемента = ~ ^ и разделитель атрибута = "="

Итак, после строки:

String[] elements = ((String) target).split(elementDilimiter);

Значения разделены следующим образом

453=3, 448=0A~!447=D~!452=1~!, 448=0A~!447=D~!452=17~!, 448=81~!447=D~!452=7~!,

Затем они делятся на равные и помещаются в карту с помощью tagNo для возврата соответствующего объекта.

Однако когда группы добираются до:

String[] attributes = element.split(attributeDelimiter);

Группы больше не идут из-за:

attributes.length != 2

Но в идеале я бы хотел, чтобы моя реализация могла захватить тег 453, понимая, что есть 3 повторяющиеся группы, повторяющиеся группы переходят в синтаксический анализатор, который разделит их на ~! и размещены на дополнительной карте.

Теперь я буду честен, когда думаю о реализации, моя голова начинает кружиться.

Есть ли простое решение eligant вокруг этого или это базовое начало с нуля.

EDIT

Определяется ли 453 как всегда идентификатор группы? Да, тег перед группами просто говорит мне, сколько будет групп. У меня нет контроля над входящей строкой, или ее формат принимает форму, описанную выше.

Что представляют ваши группы - я спрашиваю об этом, потому что я думал бы, что атрибуты вместе как часть групп, но в вашем методе вы разделяете атрибуты, а не группы, и разделяете элементы перед атрибутами? Я разделил элементы таким образом, чтобы их можно было разделить как 453 = 3 и т. Д. Однако, затем начался этот групповой бизнес. Так что теперь я должен переписать, чтобы приспособить их тоже. По сути, это моя проблема, прежде чем у меня были прекрасные значения тегов, которые сопоставлены с объектом и могут быть доступны просто через:

targetFields.get(TagNumber);

Теперь мне нужно будет переписать, чтобы обеспечить доступ к группам!

Надеюсь, это немного прояснилось

Ответы [ 2 ]

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

Этот код будет анализировать группы / подгруппы.Вы можете заменить операторы system.print своим построением карты.Однако вы можете переосмыслить формат, потому что он может быть намного понятнее, если вы используете формат, который естественным образом поддерживает вложение, например XML

@Test
public void testname() throws Exception {
    parseText("453=3~^448=0A~!447=D~!452=1~!~^448=0A~!447=D~!452=17~!~^448=81~!447=D~!452=7~!~^");
}

private int subgroupLength = 0;

public void parseText(String text) {
    for (String group : text.split("~\\^")) {
        System.out.println("Group");
        parseGroup(group);
    }
}

public void parseGroup(String group) {
    for (String attribute : group.split("~!"))
        parseAttribute(attribute);
}

public void parseAttribute(String attribute) {
    String[] split = attribute.split("=");
    if (split.length != 2)
        return;

    if (split[0].equals("453")) {
        System.out.println("\tSubgroup length " + split[1]);
        subgroupLength = Integer.parseInt(split[1]);
    } else if (subgroupLength > 0) {
        subgroupLength--;
        System.out.println("\t\t" + split[0] + " = " + split[1]);
    } else
        System.out.println("\t" + split[0] + " = " + split[1]);
}
0 голосов
/ 05 июля 2011

Используйте String.split в два этапа.Сначала разделите группы.После разделения атрибутов для каждой группы.

Это решит вашу проблему.

...