Java Dataset Class: Reading, Parsing and Exporting CSV Data
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);
}
}