2015-07-03 2 views
0

У меня есть ответ веб-службы, который предоставляет мне блок данных (в длинной строке), который я разбил на отдельные элементы, используя жесткий возврат в качестве разделителя. Это дает мне несколько предложений или элементов (как мне кажется, индексов), и каждый из них имеет несколько значений данных в каждом элементе. Например:

Прокрутите группу индексов в groovy до тех пор, пока не будет найдено значение

//Gets data from web service response<br> 
Def longstring = 
"0 * 549 F7 G8 H9 
1 2247 F6 G4 H10 
17JUN DFWPHX F7 
      M7 B2 Y1" 

//Splits the above into separate sentences/elements 
longstring.split("\\r?\\n") 
String[] Element=longstring.split("\\r?\\n") 

//Print out of elements<br> 
Log.info Element[1] = "0 * 549 F7 G8 H9" 
Log.info Element[2] = "1 2247 F6 G4 H10" 
Log.info Element [3] = "17JUN DFWPHX F7" 
Log.info Element[4]= "   M7 B2 Y1" 

Я написал блок заводной кода, который при условии элемент ID, код будет пытаться просверлить вниз, чтобы получить только определенное значение в пределах этого элемента. Например, если элемент [1], начинается с «0», то делайте «x», иначе делайте «y». Мне нужно иметь возможность прокручивать все элементы (или индексы) с помощью этого же кода до тех пор, пока я не уйду с информацией, которая мне нужна, а затем выйдите из цикла итерации/цикла, как только данные будут найдены.

Я не профессионал. Я видел результаты Google для карт, циклов и разных операторов. Ни один из них не имеет смысла в моем сценарии. Текст в каждом элементе не является списком. Картирование и цикл, похоже, требуют другой настройки, чем у меня. Если вы можете помочь мне решить эту проблему, пожалуйста, объясните, пожалуйста, код простым языком. Заранее благодарим за ваше время и опыт.

+0

Не могли бы вы вставить фактический код, который компилирует и демонстрирует вашу проблему? –

+0

Даже после редактирования форматирования, это недопустимый код –

+0

Мне жаль, Тим, я знаю, что это неверный код. Я пытался «перефразировать» проблему. Похоже, я сделал что-то непонятное, сделав это. Я использую soapUI и создаю отличный скрипт, который извлекает определенную часть данных с предыдущего шага в SoapUI. Код groovy не является моей проблемой. Код работает нормально. Мне нужна помощь в понимании того, как использовать этот код для прокрутки нескольких элементов. Прямо сейчас мой код настроен для оценки только одного элемента (т. Е. Элемента [1]). Таким образом, он берет эту линию и делает с ней что-то. Я хотел бы иметь возможность прокручивать все мои элементы с помощью того же кода. –

ответ

0

Это решение, которое сработало для меня. Я обозначил его на основании того, как мне сообщили, что он был разработан.

//String that needs to be split 
    def longString ="""0 * 549 F7 G8 H9 
    1 2247 F6 G4 H10 
    17JUN DFWPHX F7 
      M7 B2 Y1""" 


     //Splits the entire string response above into substrings based upon hard returns ("S" becomes the new chopped up strings) 
    longString.split("\\r?\\n") 
    String[] S=longString.split("\\r?\\n") 

     //Creates the variable foundData for the loop to use below 
    String foundData; 


     //Creates "subS" variable for all the elements seen in the array "S" from above            
    for(String subS: S)               
    {     
         //Creates a matcher pattern to look in each subelement (subS) where it looks for a regex pattern. 
         //Description of the regex used: /\d\s+(\d+).*/ = one digit followed by one or more spaces, followed by another one or more digits 
         //Note that the regex above includes: (\d+). This creates a "group" within the pattern, which is referred to below in the DataMatcher 
     def DataMatcher = (subS =~ /\d\s+(\d+).*/);                       

      //If the subelement (subS) matches the above pattern, it goes into the below block of code 
     if (DataMatcher.matches())             
      {   //Sets the variable foundData (see above) to value of the DataMatcher and only grabs the data needed 
         //Note that the flightMatcher has two sections [0] and [1]. These represent the following: 
         //[0] = The entire string should be looked at 
         //[1] = Only group 1 in that string should be retrieved *See group created (in comments) in the regex portion above 
        foundData = DataMatcher[0][1]; 
         //This breaks the loop once the Data needed has been matched             
           break;                                        
      }        
    } 

    //Displays the foundData needed 
    log.info foundData 
0

Здесь немного сложно понять вашу потребность, но я попробую. Предполагая, что вы хотите, чтобы часть кода выполнялась на основе шаблона линии. У меня есть пример для вас, который пытается достичь этого:

//Here I define 2 action closures - what I want to happen 
def whenZero = { line -> 
    println "The line '$line' starts with a zero" 
} 
def whenOne = {line -> 
    println "The line '$line' starts with a one" 
} 

//Then I declare patterns and map them to each of the actions 
Map methodMap = ['0.*':whenZero, '1.*':whenOne] 

//This method will do the matching of the pattern and call any action 
def executeBasedOnKey(Map map, String line){ 
    map.each{ key, method -> 
    if (line.matches(key)) method(line) 
    } 
} 

//Your input 
def longstring ="""0 * 549 F7 G8 H9 
1 2247 F6 G4 H10 
17JUN DFWPHX F7 
      M7 B2 Y1""" 

//This line calls the evaluation for each of the lines 
longstring.split("\\r?\\n").each{line-> 
    executeBasedOnKey(methodMap, line) 
} 
+0

Спасибо, Joachim! Я попытался загрузить решение, которое сработало для меня, но форматирование отключено. Я не могу заставить его выглядеть так, как вы писали выше. Не знаете, как это исправить, чтобы вы могли это увидеть. –

Смежные вопросы