Java Dataset Class: Reading, Parsing and Exporting CSV Data

Computer science6.1 KB

Java Dataset Class for Reading and Exporting Delimited Files

The following ConjuntoDatos class is part of the org.mp.sesion06 package. It reads a delimited text file, stores its header and numeric values, and can export selected columns to a new file.

package org.mp.sesion06;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Scanner;

public class ConjuntoDatos {

    private File archivoTexto;
    private String separador;
    private Locale locale;
    private List<String> cabecera;
    private int numeroLineas;
    private int numeroColumnas;
    private double[][] datos;

    public ConjuntoDatos(File archivoTexto, String separador, Locale locale) {
        this.archivoTexto = archivoTexto;
        this.separador = separador;
        this.locale = locale;
        this.cabecera = cabecera(this.archivoTexto);
        this.numeroLineas = numLineas(this.archivoTexto);
        this.numeroColumnas = numColumnas(this.archivoTexto);
        this.datos = leerDatos(this.archivoTexto, this.numeroLineas, this.numeroColumnas);
    }

    private List<String> cabecera(File archivoTexto) {
        this.cabecera = new ArrayList<String>();
        try {
            FileReader fr = new FileReader(archivoTexto);
            BufferedReader br = new BufferedReader(fr);
            String linea = br.readLine();
            Scanner sc = new Scanner(linea);
            sc.useDelimiter(separador);
            while (sc.hasNext()) {
                String trozo = sc.next();
                this.cabecera.add(trozo);
            }
            br.close();
        } catch (IOException e) {
            System.out.println("Error de lectura en el fichero");
        }
        return cabecera;
    }

    private int numLineas(File archivoTexto) {
        numeroLineas = 0;
        try {
            FileReader fr = new FileReader(archivoTexto);
            BufferedReader br = new BufferedReader(fr);
            String linea = br.readLine();
            linea = br.readLine();
            while (linea != null) {
                numeroLineas++;
                linea = br.readLine();
            }
            br.close();
        } catch (IOException e) {
        }
        return numeroLineas;
    }

    private int numColumnas(File archivoTexto) {
        numeroColumnas = 0;
        try {
            FileReader fr = new FileReader(archivoTexto);
            BufferedReader br = new BufferedReader(fr);
            String linea = br.readLine();
            Scanner sc = new Scanner(linea);
            sc.useDelimiter(separador);
            while (sc.hasNext()) {
                sc.next();
                numeroColumnas++;
            }
            br.close();
        } catch (IOException e) {
        }
        return numeroColumnas;
    }

    private double[][] leerDatos(File archivoTexto, int filas, int columnas) {
        datos = new double[filas][columnas];
        try {
            FileReader fr = new FileReader(archivoTexto);
            BufferedReader br = new BufferedReader(fr);
            String linea = br.readLine();
            linea = br.readLine();
            int i = 0;
            while (linea != null) {
                Scanner sc = new Scanner(linea);
                sc.useDelimiter(separador);
                sc.useLocale(locale);
                int j = 0;
                while (sc.hasNext()) {
                    datos[i][j] = sc.nextDouble();
                    j++;
                }
                i++;
                linea = br.readLine();
            }
            br.close();
        } catch (IOException e) {
        }
        return datos;
    }

    public double[] getColumna(int columna) {
        double[] a = new double[numeroLineas];
        for (int i = 0; i < numeroLineas; i++)
            a[i] = datos[i][columna];
        return a;
    }

    public double[] getColumna(String columna) {
        int posColumna = cabecera.indexOf(columna);
        return getColumna(posColumna);
    }

    public File getArchivoTexto() {
        return archivoTexto;
    }

    public String getSeparador() {
        return separador;
    }

    public Locale getLocale() {
        return locale;
    }

    public List<String> getCabecera() {
        return cabecera;
    }

    public int getNumeroLineas() {
        return numeroLineas;
    }

    public int getNumeroColumnas() {
        return numeroColumnas;
    }

    public double[][] getDatos() {
        return datos;
    }

    public void exportar(String[] cabecera, String archivoTexto, String separador) {
        conjuntoDatos(cabecera, archivoTexto, separador, locale);
    }

    public ConjuntoDatos conjuntoDatos(String[] cabecera, String archivoTexto, String separador, Locale locale) {
        double[][] m = new double[numeroLineas][cabecera.length];
        for (int j = 0; j < cabecera.length; j++) {
            double[] a = getColumna(cabecera[j]);
            for (int i = 0; i < numeroLineas; i++) {
                m[i][j] = a[i];
            }
        }
        try {
            File f = new File(archivoTexto);
            FileWriter fw = new FileWriter(f);
            PrintWriter pw = new PrintWriter(fw);
            String linea = "";
            for (int i = 0; i < cabecera.length; i++) {
                linea = linea + cabecera[i];
                if (i < cabecera.length - 1)
                    linea = linea + separador;
            }
            pw.println(linea);
            for (int i = 0; i < m.length; i++) {
                linea = "";
                for (int j = 0; j < m[i].length; j++) {
                    linea = linea + String.format(locale, "%.1f", m[i][j]);
                    if (j < m[i].length - 1)
                        linea = linea + separador;
                }
                pw.println(linea);
            }
            pw.close();
        } catch (IOException e) {
        }
        return new ConjuntoDatos(new File(archivoTexto), separador, locale);
    }
}

Download

PDF Word HTML