0

In groovy, I am trying to convert the following string into separate pairs, which is the form of collections. I tried using eval in groovy, but it is currently throwing an exception. Is there any elegant way to convert this string.

[[u'abcd', u'12345'], [u'cmnln', u'12121'], [u'mnmnnkj', u'11212']]
String str = "[[u'abcd', u'12345'], [u'cmnln', u'12121'], [u'mnmnnkj', u'11212']]"
list2 = Eval.me(str)

Expected Result:

Pairs: abcd, 12345 cmnln, 12121 mnmnnkj, 12121

Actual Result:

hudson.remoting.ProxyException: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Script1.groovy: 1: unexpected token: abcd @ line 1, column 4.
   [[u'abcd', u'12345'], [u'cmnln', u'12121'], [u'mnmnnkj', u'11212']]
      ^

1 error
at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
    at org.codehaus.groovy.control.ErrorCollector.addFatalError(ErrorCollector.java:150)
    at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:120)
    at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:132)
    at org.codehaus.groovy.control.SourceUnit.addError(SourceUnit.java:350)
    at org.codehaus.groovy.antlr.AntlrParserPlugin.transformCSTIntoAST(AntlrParserPlugin.java:144)
    at org.codehaus.groovy.antlr.AntlrParserPlugin.parseCST(AntlrParserPlugin.java:110)
    at org.codehaus.groovy.control.SourceUnit.parse(SourceUnit.java:234)
    at org.codehaus.groovy.control.CompilationUnit$1.call(CompilationUnit.java:168)
    at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:943)
    at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:605)
    at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
    at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
    at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
    at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
    at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:584)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:623)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:594)
    at groovy.util.Eval.me(Eval.java:69)
    at groovy.util.Eval.me(Eval.java:52)
    at groovy.util.Eval$me.callStatic(Unknown Source)
2
  • You should probably change the output format to something other than a String. That would probably be much easier to parse. Commented Jan 15, 2020 at 18:59
  • Unfortunately, I dont have control over the output format to define or change it.. Commented Jan 15, 2020 at 19:01

2 Answers 2

3

Your attempt:

String str = "[[u'abcd', u'12345'], [u'cmnln', u'12121'], [u'mnmnnkj', u'11212']]"
list2 = Eval.me(str)

That is not going to work because the value you are passing to Eval.me(...) is not valid Groovy code. In particular, expressions like u'abcd' and u'12345' are not valid.

You will need to write a parser or at least some parsing code to break that up and how to do that depends on knowledge of the data. For example, if you know every one of those String values are prefixed with u and u never appears in the data, you could do something naive like this:

        String input = "[[u'abcd', u'12345'], [u'cmnln', u'12121'], [u'mnmnnkj', u'11212']]"
        String processedInput = input.replaceAll 'u', ''
        def result  = Eval.me processedInput
        println result

If a u might occur in the data then you will need a more sophisticated regular expression.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks Jeff. I made minor change to replaceAll and tried. It works great as expected.
0

If you love overkill, like to wait half a second for the result, and think it's a good time to start using Python 2 now, this works too:

@Grab('org.python:jython-standalone:2.7.1')
import org.python.util.PythonInterpreter

String str = "[[u'abcd', u'12345'], [u'cmnln', u'12121'], [u'mnmnnkj', u'11212']]"

println(new PythonInterpreter().withCloseable{ it.eval str })
// ⇒ [[abcd, 12345], [cmnln, 12121], [mnmnnkj, 11212]]

1 Comment

Out of frustration, that Eval('u', {it}, str) does not work...

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.