Meter columnas en archivo texto [JAVA]

bornex

Hola a todos, hoy vengo con otro problema que me esta dando dolor de cabeza desde hace unos días. Expongo el problema:

Tengo un archivo con:

A;B;C
1.1;1.2;1.3
2.1;2.2;2.3
3.1;3.2;3.3

... y tengo que hacer un método que dándole el nombre de la cabecera me exporte a un nuevo archivo de texto esas columnas, es decir, si hago:

String[] cabeceraAB = {"A","B"};
exportar(cabeceraAB,archivoTexto,";");

... me tiene que crear un archivo de texto nuevo con:

A;B
1.1;1.2
2.1;2.2
3.1;3.2

(Sin lineas nuevas de por medio, no se porque salen)

Vale hasta aquí creo que me explico con claridad, yo tengo hecho este código:

public void exportar(String[] cabeceraAB, String archivoTexto, String separador) throws IOException {
		File aux = new File(archivoTexto);
		FileWriter fw = new FileWriter(aux);
		BufferedWriter bw = new BufferedWriter(fw);
		PrintWriter pw = new PrintWriter(bw);
                // Meto la cabecera.
		for (int i = 0; i < cabeceraAB.length; i++) {
			pw.print(cabeceraAB[i]);
			if (i != cabeceraAB.length - 1) {
				pw.print(";");
			}
		}
                // Meto las columnas.
		double[] tmp = new double[this.numeroLineas];
		for (int k = 0; k < cabeceraAB.length; k++) {
			tmp = getColumna(cabeceraAB[k]);
			for (int j = 0; j < tmp.length; j++) {
				pw.print("\n");
				pw.print(tmp[j]);
				if (k != tmp.length) {
					pw.print(";");
				}
			}
		}
		pw.close();
	}

... lo que hace este código es generarme un archivo de texto con la cabecera que le paso pero así:

A;B
1.1;
2.1;
3.1;
1.2;
2.2;
3.2;

¿Como hago para que me meta bien las columnas?.

Gracias de antemano, un saludo.

Lecherito

Ha de funcionar "A", "C"? Por que por lo que leo si, y si es así creo que lo estás enfocando mal el problema (parece que intentas escribir una columna, luego escribes otra etc, en vez de por filas), yo lo haría del tipo:

int[] indices = getIndicesDeColumnas(columnas);
while (temp=leelineadearchivo()) {
  pw.print(getCadenaDesdeColumnas(indices, temp));
}

Donde el getIndicesDeColumnas sería A -> indice 1, B -> indice 2, etc

Y el getCadenaDesde columnas sería algo del tipo

String temp = "";
String[] split = temp.split(";");
for (int i : indices) {
  temp += split[i];
}
return split;

Que te crea una cadena con las columnas seleccionadas y directamente imprimes esa línea

1 respuesta
bornex

Ok Lecherito, en cuanto llegue a casa lo miro y te digo. Muchas gracias ;)

bornex

#2 Lecherito, he hecho lo que me has dicho y me imprime bien las líneas, pero si quiero exportar por ejemplo "A" y "C" me coge "A","B", ¿como hago para que elija la columna adecuada?

El código que tengo es:

String linea = br.readLine();
		while ((linea = br.readLine()) != null) {
			String [] temp = linea.split(this.separador);
			pw.print("\n");
			for (int j = 0; j < cabeceraAB.length; j++) {
				pw.print(temp[j]);
				if (j != cabeceraAB.length - 1) {
					pw.print(";");
				}
			}
		}

La salida si coge "A","B" es:

A;B
1.1;1.2
2.1;2.2
3.1;3.2

(La esperada)

pero si le paso "A","C" es:

A;C
1.1;1.2
2.1;2.2
3.1;3.2

... la no esperada xD.

¿Que es lo que me falta?

COSMOS

Deberías guiarte por las posiciones. Me explico brevemente:
Tu cabecera del fichero es A;B;C
Cuando tu le pasas A;B en realidad le estas diciendo "pasame las columnas que coincidan con este nombre"
Es decir que tienes que asociar A -> columna 1, B-> columna 2
De la misma manera que si introduces A;C le estas pidiendo las columnas 1 y 3

Algo así(no te fíes del código, solo del procedimiento)

String[] cabeceraFichero = linea.split(this.separador,-1); //el -1 para el caso en que te vengan líneas ";;;;"

String miCabecera ="A;B";
int[] columnas = damePosicion(miCabecera)//funcion que devuelve las posiciones de las cabeceras, tendrías que implementarla -> private int[] damePosicion(String cabeceraInput);
// si el input es "A;B", te devuelve [1,2]. Si es "C;B" -> [3,2]

//lo siguiente es leer linea a linea y enviar al otro fichero
//Si es pequeño el fichero, yo leeria todo el fichero y lo guardaria en un array bidimensional, usando dentro de un bucle hasta el final
arrayStorage[i] = linealeida.split(";",-1);


//y a continuacion recorriendo el array extrayendo las posiciones de columnas
por cada elemento de arrayStorage

        por cada elemento de columnas -> copiaElemento en arraySalida/fichero

como consejo: cuando tengas q programar algo, piensa en lo que te piden no como casos particulares, si no cmo un procedimiento que se ajuste a un esquema, y desarrollas la idea de forma abstracta. de esta forma es muy posible que puedas reutilizar codigo en un futuro con solo añadir un par de lineas

suerte

edito: el problema en si es que no estabas trasladando el filtro de "las columnas que he pedido" al resto del fichero

1 respuesta
Lecherito

Te hice un pequeño "pseudocódigo" de como lo tenías que hacer, por que lo intentas hacer todo a lo burro otra vez? xD

1 respuesta
bornex

#5 Vale COSMOS ya lo he sacado, gracias a ti, y #6 sí, lo he hecho a lo bruto al final.

Muchas gracias por la ayuda chicos y sobre todo por los consejos de programación, todavía me queda mucho por programar y por aprender :).

Un saludo.

Usuarios habituales

  • bornex
  • Lecherito
  • COSMOS