Ejemplo n.º 1
0
  /**
   * 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'}));
  }