/** * Copyright 2006 by Know-Center, Graz, Austria * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a * joint initiative of the Federal Chancellery Austria and Graz University of * Technology. * * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by * the European Commission - subsequent versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * http://www.osor.eu/eupl/ * * Unless required by applicable law or agreed to in writing, software * distributed under the Licence is distributed on an "AS IS" basis, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the Licence for the specific language governing permissions and * limitations under the Licence. * * This product combines work with different licenses. See the "NOTICE" text * file for details on the various modules and licenses. * The "NOTICE" text file is part of the distribution. Any derivative works * that you distribute must include a readable copy of the "NOTICE" text file. */ package at.gv.egiz.pdfas.utils; import org.apache.commons.lang.StringUtils; /** * Methods in order to create valid delimiter separated data, where the semicolon as used as delimiter, also known as * the German version of CSV. * * @author Datentechnik Innovation GmbH * @see RFC 4180 */ public class CsvUtils { /** * The delimiter char used instead of COMMA. */ public static final char DEFAULT_DELIMITER = ';'; private static final char QUOTE_CHAR = '"'; private static final char LF_CHAR = '\n'; private static final char CR_CHAR = '\r'; private static final char[] SHOULD_BE_QUOTED = { LF_CHAR, CR_CHAR, DEFAULT_DELIMITER, QUOTE_CHAR }; private static final String CSV_QUOTE = String.valueOf(QUOTE_CHAR); /** * Returns an DSV escapted representation of the given object using the default delimiter character ( * {@link #DEFAULT_DELIMITER}). * * @param obj * The object. * @return An escapted representation of the given object. */ public static String escapeCsvValue(Object obj) { // null value should be printed as empty column if (obj == null) { return ""; } // get String representation of object String asString = String.valueOf(obj); // do we need to escape anything? if (StringUtils.containsNone(asString, SHOULD_BE_QUOTED)) { return asString; } // RFC 4180 (7): If double-quotes are used to enclose fields, then a double-quote // appearing inside a field must be escaped by preceding it with // another double quote. asString = StringUtils.replace(asString, CSV_QUOTE, CSV_QUOTE + CSV_QUOTE); // RFC 4180 (6): Fields containing line breaks (CRLF), double quotes, and commas // should be enclosed in double-quotes. if (StringUtils.containsAny(asString, SHOULD_BE_QUOTED)) { return QUOTE_CHAR + asString + QUOTE_CHAR; } return asString; } }