/** * @param delimited line of delimited text * @param delimiter delimiter to split fields on * @return delimited strings, parsed according to RFC 4180 but with the given delimiter */ public static String[] parseDelimited(String delimited, char delimiter) { return doParseDelimited(delimited, formatForDelimiter(delimiter)); }
/** * @param elements values to join by the delimiter to make one line of text * @param delimiter delimiter to put between fields * @return one line of text, with RFC 4180 escaping (values with comma are quoted; double-quotes * are escaped by doubling) and using the given delimiter */ public static String joinDelimited(Iterable<?> elements, char delimiter) { return doJoinDelimited(elements, formatForDelimiter(delimiter)); }
private String toUpdateJSON(String matrix, String ID, float[] vector, String otherID) { List<?> args; if (noKnownItems) { args = Arrays.asList(matrix, ID, vector); } else { args = Arrays.asList(matrix, ID, vector, Collections.singletonList(otherID)); } return TextUtils.joinJSON(args); }
@Test public void testConvertViaJSON() { assertEquals(3, TextUtils.convertViaJSON("3", Long.class).longValue()); assertArrayEquals(new float[] { 1.0f, 2.0f }, TextUtils.convertViaJSON(new double[] { 1.0, 2.0 }, float[].class)); }
@Test public void testReadJSON() { assertEquals(3, TextUtils.readJSON("3", Integer.class).intValue()); assertEquals(Arrays.asList("foo", "bar"), TextUtils.readJSON("[\"foo\", \"bar\"]", List.class)); assertArrayEquals(new float[] { 1.0f, 2.0f }, TextUtils.readJSON("[1,2]", float[].class)); }
@Test public void testJoinJSON() { assertEquals("[\"1\",\"2\",\"3\"]", TextUtils.joinJSON(Arrays.asList("1", "2", "3"))); assertEquals("[\"1 \",\"2 \",\"3\"]", TextUtils.joinJSON(Arrays.asList("1 ", "2 ", "3"))); assertEquals("[]", TextUtils.joinJSON(Collections.emptyList())); }
@Test public void testParseDelimited() throws Exception { assertArrayEquals(new String[] {"a", "1", "foo"}, TextUtils.parseDelimited("a,1,foo", ',')); assertArrayEquals(new String[] {"a", "1", "foo", ""}, TextUtils.parseDelimited("a,1,foo,", ',')); assertArrayEquals(new String[] {"2.3"}, TextUtils.parseDelimited("2.3", ',')); assertArrayEquals(new String[] {"\"a\""}, TextUtils.parseDelimited("\"\"\"a\"\"\"", ',')); assertArrayEquals(new String[] {"\"", "\"\""}, TextUtils.parseDelimited("\"\"\"\" \"\"\"\"\"\"", ' ')); // Different from JSON, sort of: assertArrayEquals(new String[] {""}, TextUtils.parseDelimited("", ',')); assertArrayEquals(new String[] {"a", "1,", ",foo"}, TextUtils.parseDelimited("a\t1,\t,foo", '\t')); assertArrayEquals(new String[] {"a", "1", "foo", ""}, TextUtils.parseDelimited("a 1 foo ", ' ')); assertArrayEquals(new String[] {"-1.0", "a\" \"b"}, TextUtils.parseDelimited("-1.0 a\"\\ \"b", ' ')); assertArrayEquals(new String[] {"-1.0", "a\"b\"c"}, TextUtils.parseDelimited("-1.0 \"a\\\"b\\\"c\"", ' ')); }
@Test public void testJoinPMMLDelimited() { assertEquals("ab \"a b\" \"with \\\"quotes\\\" \"", TextUtils.joinPMMLDelimited(Arrays.asList("ab", "a b", "with \"quotes\" "))); assertEquals("1 22 3", TextUtils.joinPMMLDelimited(Arrays.asList("1", "22", "3"))); assertEquals("\" c\\\" d \\\"e \" \" c\\\" d \\\"e \"", TextUtils.joinPMMLDelimited(Arrays.asList(" c\" d \"e ", " c\" d \"e "))); }
@Test public void testParsePMMLDelimited() { assertArrayEquals(new String[] {"1", "22", "3"}, TextUtils.parsePMMLDelimited("1 22 3")); assertArrayEquals(new String[] {"ab", "a b", "with \"quotes\" "}, TextUtils.parsePMMLDelimited("ab \"a b\" \"with \\\"quotes\\\" \" ")); assertArrayEquals(new String[] {"\" \""}, TextUtils.parsePMMLDelimited("\"\\\" \\\"\"")); assertArrayEquals(new String[] {" c\" d \"e ", " c\" d \"e "}, TextUtils.parsePMMLDelimited(" \" c\\\" d \\\"e \" \" c\\\" d \\\"e \" ")); }
@Test public void testJoinDelimited() { assertEquals("1,2,3", TextUtils.joinDelimited(Arrays.asList("1", "2", "3"), ',')); assertEquals("\"a,b\"", TextUtils.joinDelimited(Arrays.asList("a,b"), ',')); assertEquals("\"\"\"a\"\"\"", TextUtils.joinDelimited(Arrays.asList("\"a\""), ',')); assertEquals("1 2 3", TextUtils.joinDelimited(Arrays.asList("1", "2", "3"), ' ')); assertEquals("\"1 \" \"2 \" 3", TextUtils.joinDelimited(Arrays.asList("1 ", "2 ", "3"), ' ')); assertEquals("\"\"\"a\"\"\"", TextUtils.joinDelimited(Arrays.asList("\"a\""), ' ')); assertEquals("\"\"\"\" \"\"\"\"\"\"", TextUtils.joinDelimited(Arrays.asList("\"", "\"\""), ' ')); assertEquals("", TextUtils.joinDelimited(Collections.emptyList(), '\t')); }
@Test public void testJoinPMMLDelimitedNumbers() { assertEquals("-1.0 2.01 3.5", TextUtils.joinPMMLDelimitedNumbers(Arrays.asList(-1.0, 2.01, 3.5))); }
/** * @param pmml PMML model to add extension to, with a single {@code String} content and no value. * The content is encoded as if they were being added to a PMML {@link Array} and are * space-separated with PMML quoting rules * @param key extension key * @param content list of values to add as a {@code String} */ public static void addExtensionContent(PMML pmml, String key, Collection<?> content) { if (content.isEmpty()) { return; } String joined = TextUtils.joinPMMLDelimited(content); pmml.addExtensions(new Extension().setName(key).addContent(joined)); }
@Test public void testParseJSON() throws Exception { assertArrayEquals(new String[] {"a", "1", "foo"}, TextUtils.parseJSONArray("[\"a\",\"1\",\"foo\"]")); assertArrayEquals(new String[] {"a", "1", "foo", ""}, TextUtils.parseJSONArray("[\"a\",\"1\",\"foo\",\"\"]")); assertArrayEquals(new String[] {"2.3"}, TextUtils.parseJSONArray("[\"2.3\"]")); assertArrayEquals(new String[] {}, TextUtils.parseJSONArray("[]")); }
/** * @param values {@code double} value to make into a PMML {@link Array} * @return PMML {@link Array} representation */ public static Array toArray(double... values) { List<Double> valueList = new ArrayList<>(values.length); for (double value : values) { valueList.add(value); } String arrayValue = TextUtils.joinPMMLDelimitedNumbers(valueList); return new Array(Array.Type.REAL, arrayValue).setN(valueList.size()); }
@Test public void testJSONMap() { Map<Object,Object> map = new HashMap<>(); map.put(1, "bar"); map.put("foo", 2); assertEquals("[\"A\",{\"1\":\"bar\",\"foo\":2},\"B\"]", TextUtils.joinJSON(Arrays.asList("A", map, "B"))); }
@Override public Pair<String, String> generate(int id, RandomGenerator random) { return new Pair<>(Integer.toString(id), TextUtils.joinJSON(arrayToList(UPDATE_POINTS[id % UPDATE_POINTS.length]))); }
/** * @param elements numbers to join by space to make one line of text * @return one line of text, formatted according to PMML quoting rules */ public static String joinPMMLDelimitedNumbers(Iterable<? extends Number> elements) { // bit of a workaround because NON_NUMERIC quote mode still quote "-1"! CSVFormat format = formatForDelimiter(' ').withQuoteMode(QuoteMode.NONE); // No quoting, no need to convert quoting return doJoinDelimited(elements, format); }
@Test public void testJSONList() { List<Object> list = new ArrayList<>(); list.add("foo"); list.add(2); assertEquals("[\"A\",[\"foo\",2],\"B\"]", TextUtils.joinJSON(Arrays.asList("A", list, "B"))); }
@Override public Pair<String,String> generate(int id, RandomGenerator random) { if (id == 0) { PMML pmml = KMeansPMMLUtilsTest.buildDummyClusteringModel(); return new Pair<>("MODEL", PMMLUtils.toString(pmml)); } else { List<?> data = Arrays.asList(id % 3, Arrays.asList(id, id), id); return new Pair<>("UP", TextUtils.joinJSON(data)); } }
/** * @param elements values to join by space to make one line of text * @return one line of text, formatted according to PMML quoting rules * (\" instead of "" for escaping quotes; ignore space surrounding values */ public static String joinPMMLDelimited(Iterable<?> elements) { String rawResult = doJoinDelimited(elements, formatForDelimiter(' ')); // Must change "" into \" return TWO_DOUBLE_QUOTE_ESC.matcher(rawResult).replaceAll(SLASH_QUOTE_ESC); }