/*********************************************************************** This file is part of KEEL-software, the Data Mining tool for regression, classification, clustering, pattern mining and so on. Copyright (C) 2004-2010 F. Herrera (herrera@decsai.ugr.es) L. S�nchez (luciano@uniovi.es) J. Alcal�-Fdez (jalcala@decsai.ugr.es) S. Garc�a (sglopez@ujaen.es) A. Fern�ndez (alberto.fernandez@ujaen.es) J. Luengo (julianlm@decsai.ugr.es) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ **********************************************************************/ /* * KeelToDb.java */ package keel.Algorithms.Preprocess.Converter; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.sql.*; /** * <p> * <b> KeelToDb </b> * </p> * * Clase extendida de la clase Exporter. Esta clase permite convertir * un fichero de datos con formato Keel a una nueva tabla en una base de * datos SQL. * * @author Teresa Prieto López (UCO) * @version 1.0 */ public class KeelToDb extends Exporter { //Variable que almacena el driver para conectarse a la base de datos. private String driverName = new String();// Variable que almacena el nombre de la base de datos. private String databaseURL = new String();// Variable que almacena el nombre de la tabla que contiene los datos a convertir. private String tableName = new String();// Variable que almacena el login o nombre de usuario de la base de datos. private String login = new String();// Variable que almacena el password o contraseña de la base de datos. private String password = new String(); /* * Constructor de la Clase DbToKeel. Inicializa los valores de las variables * miembro driverName, databaseURL, tableName, login y password * con el valor de los parámetros driverNameUser, databaseURLUser, tableNameUser, loginUser, passwordUser respectivamente. * También inicializa el valor para la variable miembro nullValue a una cadena con valor "null". * * @param String driverNameUser Variable de tipo String con el valor del driver de la conexion a la base de datos. * @param String databaseURL: Variable que almacena la dirección URL de la base de datos * de la forma jdbc:subprotocol:subname donde subprotocol es el nombre * del controlador, y subname es una referencia controlador-específica a la base de datos. * @param String tableNameUser Variable de tpo String con el nombre de la tabla que contiene los datos. * @param String loginUser Variable de tipo String con el login o nombre de usuario para conectarse a la base de datos. * @param String passwordUser Variable de tipo String con el password o contraseña para conectarse a la base de datos. * */ public KeelToDb(String driverNameUser, String databaseURLUser, String tableNameUser, String loginUser, String passwordUser) { driverName = driverNameUser; databaseURL = databaseURLUser; tableName = tableNameUser; login = loginUser; password = passwordUser; nullValue = "null"; } /* * Este método llama al método Start de la clase superior Exporter para * cargar los datos del fichero Keel y posteriormente hace una llamada * al método Save() para crear una nueva tabla en la base de datos. * * @param String pathnameInput Variable con la ruta del fichero de datos keel. * * @throws Exception. */ @Override public void Start(String pathnameInput) throws Exception { super.Start(pathnameInput); Save(); }//end Start() /* * Método utilizado para crear la tabla en la base de datos SQL * a partir de los datos almacenados en el vector de objetos de la clase * Attribute, el vector data[], y la variable nameRelation. * * @throws Exception. * */ public void Save() throws Exception { Pattern p; Matcher m; int i = 0; int j = 0; int type = -1; String typeTable = new String(); String element = new String(); String line = new String(); String nameAttribute = new String(); //Se declara la variable de tipo conexion, que guardará la conexión a la base de datos Connection conn; //Se declara la variable de tipo Statement que nos permitirá ejecutar sentencias Statement statement; //Se declara la variable de tipo Resulset para recoger lo que devuelve una sentencia SELECT ResultSet result; // Se carga el driver try { Class.forName(driverName); } catch (Exception e) { System.out.println(e); System.exit(1); } try { // Se establece la conexión con la base de datos conn = DriverManager.getConnection(databaseURL, login, password); //URL BaseDatos, usuario, clave statement = conn.createStatement(); try { p = Pattern.compile("[^A-Za-z0-9_$#]+"); m = p.matcher(tableName); tableName = m.replaceAll(""); if (tableName.length() > 30) { tableName = tableName.substring(0, 30); //Se elimina la tabla en caso de que ya existiese } statement.execute("DROP TABLE " + tableName); } catch (SQLException e) { } //Esto es codigo SQL statement.execute("CREATE TABLE " + tableName); for (i = 0; i < numAttributes; i++) { type = attribute[i].getType(); if (type == NOMINAL || type == -1) { typeTable = "text"; } if (type == REAL || type == INTEGER) { typeTable = "double"; } if (type == INTEGER) { typeTable = "integer"; } nameAttribute = attribute[i].getName(); if (nameAttribute.contains(" ")) { StringTokenizer tokenUcfirts = new StringTokenizer(nameAttribute, " "); String lineUcfirts = ""; if (tokenUcfirts.hasMoreTokens()) { lineUcfirts = tokenUcfirts.nextToken(); } while (tokenUcfirts.hasMoreTokens()) { lineUcfirts = lineUcfirts.concat(UcFirst(tokenUcfirts.nextToken())); } nameAttribute = lineUcfirts; } p = Pattern.compile("[^A-Za-z0-9_$#]+"); m = p.matcher(nameAttribute); nameAttribute = m.replaceAll(""); if (nameAttribute.length() > 30) { nameAttribute = nameAttribute.substring(0, 30); } if (nameAttribute.equals("")) { nameAttribute = "ATTRIBUTE_" + (i + 1) + ""; } nameAttribute = "\"" + nameAttribute + "\""; statement.execute("ALTER TABLE " + tableName + " ADD " + nameAttribute + " " + typeTable); } for (i = 0; i < data[0].size(); i++) { line = ""; for (j = 0; j < numAttributes; j++) { element = (String) data[j].elementAt(i); type = attribute[j].getType(); if (type == NOMINAL && !element.equals(nullValue)) { element = "'" + element + "'"; } if (j == numAttributes - 1) { line = line.concat(element); } else { line = line.concat(element + ","); } } statement.execute("INSERT INTO " + tableName + " VALUES (" + line + ")"); } statement.close(); conn.close(); } catch (Exception e) { System.out.println(e); System.exit(2); } attribute = null; data = null; System.out.println("La tabla " + tableName + " ha sido creada correctamente"); }//end Save() /* * Método utilizado para poner en mayúscula el primer carácter de una cadena pasada * por parámetro. * * @param line. Variable String que almacena la cadena * a la que se pretende poner el primer carácter en mayúscula. * * @return Devuelve una cadena igual a la cadena pasada por parámetro * pero con el primer carácter en mayúscula. */ public String UcFirst(String line) { String lineTemp = ""; if (line.length() > 1) { String charFirst = (line.substring(0, 1)).toUpperCase(); lineTemp = lineTemp.concat(charFirst); lineTemp = lineTemp.concat(line.substring(1, line.length())); } else { lineTemp = line; } return lineTemp; } }// end class KeelToDb