/** * Returns a <code>String</code> value for an unescaped CSV column. * * <p>If the value is enclosed in double quotes, and contains a comma, newline or double quote, * then quotes are removed. * * <p>Any double quote escaped characters (a pair of double quotes) are unescaped to just one * double quote. * * <p>If the value is not enclosed in double quotes, or is and does not contain a comma, newline * or double quote, then the String value is returned unchanged. see <a * href="http://en.wikipedia.org/wiki/Comma-separated_values">Wikipedia</a> and <a * href="http://tools.ietf.org/html/rfc4180">RFC 4180</a>. * * @param str the input CSV column String, may be null * @param out Writer to write the input String to, with enclosing double quotes removed and * embedded double quotes unescaped, <code>null</code> if null string input * @throws IOException if error occurs on underlying Writer * @since 2.4 */ public static void unescapeCsv(Writer out, String str) throws IOException { if (str == null) { return; } if (str.length() < 2) { out.write(str); return; } if (str.charAt(0) != CSV_QUOTE || str.charAt(str.length() - 1) != CSV_QUOTE) { out.write(str); return; } // strip quotes String quoteless = str.substring(1, str.length() - 1); if (StringUtils.containsAny(quoteless, CSV_SEARCH_CHARS)) { // deal with escaped quotes; ie) "" str = StringUtils.replace(quoteless, CSV_QUOTE_STR + CSV_QUOTE_STR, CSV_QUOTE_STR); } out.write(str); }
@Override public int translate(final CharSequence input, final int index, final Writer out) throws IOException { if (index != 0) { throw new IllegalStateException("CsvUnescaper should never reach the [1] index"); } if (input.charAt(0) != CSV_QUOTE || input.charAt(input.length() - 1) != CSV_QUOTE) { out.write(input.toString()); return input.length(); } // strip quotes final String quoteless = input.subSequence(1, input.length() - 1).toString(); if (StringUtils.containsAny(quoteless, CSV_SEARCH_CHARS)) { // deal with escaped quotes; ie) "" out.write(StringUtils.replace(quoteless, CSV_QUOTE_STR + CSV_QUOTE_STR, CSV_QUOTE_STR)); } else { out.write(input.toString()); } return input.length(); }
public void testContainsAny_StringString() { assertFalse(StringUtils.containsAny(null, (String) null)); assertFalse(StringUtils.containsAny(null, "")); assertFalse(StringUtils.containsAny(null, "ab")); assertFalse(StringUtils.containsAny("", (String) null)); assertFalse(StringUtils.containsAny("", "")); assertFalse(StringUtils.containsAny("", "ab")); assertFalse(StringUtils.containsAny("zzabyycdxx", (String) null)); assertFalse(StringUtils.containsAny("zzabyycdxx", "")); assertTrue(StringUtils.containsAny("zzabyycdxx", "za")); assertTrue(StringUtils.containsAny("zzabyycdxx", "by")); assertFalse(StringUtils.containsAny("ab", "z")); }
// ----------------------------------------------------------------------- public void testContainsAny_StringChararray() { assertFalse(StringUtils.containsAny(null, (char[]) null)); assertFalse(StringUtils.containsAny(null, new char[0])); assertFalse(StringUtils.containsAny(null, new char[] {'a', 'b'})); assertFalse(StringUtils.containsAny("", (char[]) null)); assertFalse(StringUtils.containsAny("", new char[0])); assertFalse(StringUtils.containsAny("", new char[] {'a', 'b'})); assertFalse(StringUtils.containsAny("zzabyycdxx", (char[]) null)); assertFalse(StringUtils.containsAny("zzabyycdxx", new char[0])); assertTrue(StringUtils.containsAny("zzabyycdxx", new char[] {'z', 'a'})); assertTrue(StringUtils.containsAny("zzabyycdxx", new char[] {'b', 'y'})); assertFalse(StringUtils.containsAny("ab", new char[] {'z'})); }