/* * ARX: Powerful Data Anonymization * Copyright 2014 - 2015 Karol Babioch, Fabian Prasser, Florian Kohlmayer * * Licensed under the Apache 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://www.apache.org/licenses/LICENSE-2.0 * * 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. */ package org.deidentifier.arx.io; import java.nio.charset.Charset; /** * Configuration describing a CSV file. * * @author Karol Babioch * @author Fabian Prasser */ public class ImportConfigurationCSV extends ImportConfigurationFile implements IImportConfigurationWithHeader { /** Character that separates the columns from each other. */ private final char delimiter; /** Character that delimits strings. */ private final char quote; /** Characters that delimits lines. */ private final char[] linebreak; /** Character that escapes. */ private final char escape; /** * Indicates whether first row contains header (names of columns). * * @see {@link IImportConfigurationWithHeader} */ private boolean containsHeader; /** The charset of the CSV file */ private final Charset charset; /** * Creates a new instance of this object. * * @param fileLocation {@link #setFileLocation(String)} * @param containsHeader {@link #containsHeader} */ public ImportConfigurationCSV(String fileLocation, Charset charset, boolean containsHeader) { this(fileLocation, charset, CSVSyntax.DEFAULT_DELIMITER, CSVSyntax.DEFAULT_QUOTE, CSVSyntax.DEFAULT_ESCAPE, containsHeader); } /** * Creates a new instance of this object. * * @param fileLocation {@link #setFileLocation(String)} * @param charset {@link #charset} * @param delimiter {@link #separator} * @param containsHeader {@link #containsHeader} */ public ImportConfigurationCSV(String fileLocation, Charset charset, char delimiter, boolean containsHeader) { this(fileLocation, charset, delimiter, CSVSyntax.DEFAULT_QUOTE, CSVSyntax.DEFAULT_ESCAPE, containsHeader); } /** * Creates a new instance of this object. * * @param fileLocation {@link #setFileLocation(String)} * @param charset {@link #charset} * @param delimiter {@link #delimiter} * @param quote {@link #quote} * @param containsHeader {@link #containsHeader} */ public ImportConfigurationCSV(String fileLocation, Charset charset, char delimiter, char quote, boolean containsHeader) { this(fileLocation, charset, delimiter, quote, CSVSyntax.DEFAULT_ESCAPE, containsHeader); } /** * Creates a new instance of this object. * * @param fileLocation {@link #setFileLocation(String)} * @param charset {@link #charset} * @param delimiter {@link #delimiter} * @param quote {@link #quote} * @param escape {@link #escape} * @param containsHeader {@link #containsHeader} */ public ImportConfigurationCSV(String fileLocation, Charset charset, char delimiter, char quote, char escape, boolean containsHeader) { this(fileLocation, charset, delimiter, quote, escape, CSVSyntax.DEFAULT_LINEBREAK, containsHeader); } /** * Creates a new instance of this object. * * @param fileLocation the file location * @param charset the charset * @param delimiter the delimiter * @param quote the quote * @param escape the escape * @param linebreak the linebreak * @param containsHeader the contains header */ public ImportConfigurationCSV(String fileLocation, Charset charset, char delimiter, char quote, char escape, char[] linebreak, boolean containsHeader) { setFileLocation(fileLocation); this.quote = quote; this.delimiter = delimiter; this.escape = escape; this.containsHeader = containsHeader; this.linebreak = linebreak; this.charset = charset; } /** * Adds a single column to import from * * This makes sure that only {@link ImportColumnCSV} can be added, otherwise * an {@link IllegalArgumentException} will be thrown. * * @param column * A single column to import from, {@link ImportColumnCSV} */ @Override public void addColumn(ImportColumn column) { if (!(column instanceof ImportColumnCSV)) { throw new IllegalArgumentException("Column needs to be of type CSVColumn"); } if (!((ImportColumnCSV) column).isIndexSpecified() && !getContainsHeader()) { final String ERROR = "Adressing columns by name is only possible if the source contains a header"; throw new IllegalArgumentException(ERROR); } for (ImportColumn c : columns) { if (((ImportColumnCSV) column).isIndexSpecified() && (((ImportColumnCSV) column).getIndex() == ((ImportColumnCSV) c).getIndex())) { throw new IllegalArgumentException("Column for this index already assigned"); } if (!((ImportColumnCSV) column).isIndexSpecified() && ((ImportColumnCSV) column).getName().equals(((ImportColumnCSV) c).getName())) { throw new IllegalArgumentException("Column for this name already assigned"); } if ((column.getAliasName() != null) && (c.getAliasName() != null) && c.getAliasName().equals(column.getAliasName())) { throw new IllegalArgumentException("Column names need to be unique"); } } columns.add(column); } /** * Returns the charset of the CSV file. * @return */ public Charset getCharset() { return charset; } /** * Gets the contains header. * * @return {@link #containsHeader} */ @Override public boolean getContainsHeader() { return containsHeader; } /** * Gets the delimiter. * * @return {@link #delimiter} */ public char getDelimiter() { return delimiter; } /** * Gets the escape. * * @return {@link #quote} */ public char getEscape() { return escape; } /** * Gets the linebreak. * * @return {@link #linebreak} */ public char[] getLinebreak() { return linebreak; } /** * Gets the quote. * * @return {@link #quote} */ public char getQuote() { return quote; } /** * Sets the indexes based on the header. * * @param row the row */ public void prepare(String[] row) { for (ImportColumn c : super.getColumns()) { ImportColumnCSV column = (ImportColumnCSV) c; if (!column.isIndexSpecified()) { boolean found = false; for (int i = 0; i < row.length; i++) { if (row[i].equals(column.getName())) { found = true; column.setIndex(i); } } if (!found) { throw new IllegalArgumentException("Index for column '" + column.getName() + "' couldn't be found"); } } } } /** * Sets the contains header. * * @param containsHeader {@link #containsHeader} */ @Override public void setContainsHeader(boolean containsHeader) { this.containsHeader = containsHeader; } }