All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jgrapht.io.DSVUtils Maven / Gradle / Ivy

The newest version!
/*
 * (C) Copyright 2016-2017, by Dimitrios Michail and Contributors.
 *
 * JGraphT : a free Java graph-theory library
 *
 * This program and the accompanying materials are dual-licensed under
 * either
 *
 * (a) the terms of the GNU Lesser General Public License version 2.1
 * as published by the Free Software Foundation, or (at your option) any
 * later version.
 *
 * or (per the licensee's choosing)
 *
 * (b) the terms of the Eclipse Public License v1.0 as published by
 * the Eclipse Foundation.
 */
package org.jgrapht.io;

/**
 * Helper utilities for escaping and unescaping Delimiter-separated values.
 * 
 * Used in {@link CSVExporter} and {@link CSVImporter}.
 * 
 * @see CSVImporter
 * @see CSVExporter
 * 
 * @author Dimitrios Michail
 * @since August 2016
 */
class DSVUtils
{
    private static final char DSV_QUOTE = '"';
    private static final char DSV_LF = '\n';
    private static final char DSV_CR = '\r';
    private static final String DSV_QUOTE_AS_STRING = String.valueOf(DSV_QUOTE);

    /**
     * Test if a character can be used as a delimiter in a Delimiter-separated values file.
     * 
     * @param delimiter the character to test
     * @return {@code true} if the character can be used as a delimiter, {@code} false otherwise
     */
    public static boolean isValidDelimiter(char delimiter)
    {
        return delimiter != DSV_LF && delimiter != DSV_CR && delimiter != DSV_QUOTE;
    }

    /**
     * Escape a Delimiter-separated values string.
     * 
     * @param input the input
     * @param delimiter the delimiter
     * @return the escaped output
     */
    public static String escapeDSV(String input, char delimiter)
    {
        char[] specialChars = new char[] { delimiter, DSV_QUOTE, DSV_LF, DSV_CR };

        boolean containsSpecial = false;
        for (int i = 0; i < specialChars.length; i++) {
            if (input.contains(String.valueOf(specialChars[i]))) {
                containsSpecial = true;
                break;
            }
        }

        if (containsSpecial) {
            return DSV_QUOTE_AS_STRING
                + input.replaceAll(DSV_QUOTE_AS_STRING, DSV_QUOTE_AS_STRING + DSV_QUOTE_AS_STRING)
                + DSV_QUOTE_AS_STRING;
        }

        return input;
    }

    /**
     * Unescape a Delimiter-separated values string.
     * 
     * @param input the input
     * @param delimiter the delimiter
     * @return the unescaped output
     */
    public static String unescapeDSV(String input, char delimiter)
    {
        char[] specialChars = new char[] { delimiter, DSV_QUOTE, DSV_LF, DSV_CR };

        if (input.charAt(0) != DSV_QUOTE || input.charAt(input.length() - 1) != DSV_QUOTE) {
            return input;
        }

        String noQuotes = input.subSequence(1, input.length() - 1).toString();

        boolean containsSpecial = false;
        for (int i = 0; i < specialChars.length; i++) {
            if (noQuotes.contains(String.valueOf(specialChars[i]))) {
                containsSpecial = true;
                break;
            }
        }

        if (containsSpecial) {
            return noQuotes
                .replaceAll(DSV_QUOTE_AS_STRING + DSV_QUOTE_AS_STRING, DSV_QUOTE_AS_STRING);
        }

        return input;
    }
}

// End DSVUtils.java




© 2015 - 2024 Weber Informatics LLC | Privacy Policy