/* * #%L * Course Signup Webapp * %% * Copyright (C) 2010 - 2013 University of Oxford * %% * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://opensource.org/licenses/ecl2 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ package uk.ac.ox.oucs.vle.resources; import java.io.IOException; import java.io.Writer; import java.util.regex.Pattern; /** * A CSV file writer. This escapes all the passed content so it can be written * safely to a CSV file. * Implementation created as we can't reuse an existing GPL CSV project. * Guidance from: * http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm * @author buckett */ public class CSVWriter { // Starts of ends with a blank, or contains a double quote, comma or newline private static final Pattern shouldQuote = Pattern.compile("(^\\p{Blank})|\"|,|\\n|\\r|(\\p{Blank}$)"); private static final Pattern doubleQuote = Pattern.compile("\""); private static final String separator = ","; private Writer out; private boolean firstColumn = true; private String lineEnding = "\n"; /** * Create the writer wrapping up an existing writer. * @param out The output to send the CSV file to. */ public CSVWriter (Writer out) { this.out = out; } /** * Write a single data value to the CSV file. * @param data The data to write to the CSV file */ public void write(String data) throws IOException { if (firstColumn) firstColumn = false; else out.write(separator); out.write(formatData(data)); } /** * Terminates the current CSV row. */ public void writeln() throws IOException { out.write(lineEnding); firstColumn = true; } /** * Outputs a complete CSV row. * @param columns The data to write out to row. */ public void writeln(String[] columns) throws IOException { for (int column = 0; column < columns.length; column++) write(columns[column]); writeln(); } private String formatData(String data) { if (null == data) { return "\"\""; } //if (shouldQuote.matcher(data).find()) //{ data = "\""+ doubleQuote.matcher(data).replaceAll("\"\"")+ "\""; //} return data; } }