Questa è una classettina che mi scrissi un po' di tempo fa per fare proprio sta roba.
Ovviamente me l'ero scritta per me, quindi non è sufficientemente fault-tolerant (ad esempio, ciascuna "riga" deve obbligatoriamente avere lo stesso numero di colonne, altrimenti s'arrabbia).
Fa il suo sporco lavoro e per quantità di dati non esagerate è anche abbastanza veloce.
codice:
public class IncolonnaSuFile {
public static void scriviFile(File fileOutput, List<String[]> dati, int spaziaturaColonne) throws IOException {
if ((dati != null) && !dati.isEmpty()) {
// Preparo la spaziatura tra le colonne
StringBuilder spaziatura = new StringBuilder();
while(spaziatura.length() < spaziaturaColonne) spaziatura.append(' ');
FileWriter fw = null;
BufferedWriter bw = null;
PrintWriter pw = null;
try {
fw = new FileWriter( fileOutput );
bw = new BufferedWriter( fw );
pw = new PrintWriter( bw );
// Scorro tutti i dati per calcolare le dimensioni delle colonne
int[] columnWidth = calcolaDimensioneColonne( dati );
// Ora scorro nuovamente i dati per scrivere il file
StringBuilder sbRiga = new StringBuilder();
for(String[] riga : dati) {
for(int i=0; i<riga.length; i++) {
sbRiga.append( fill(riga[i], columnWidth[i]) ).append( spaziatura.toString() );
}
pw.println( sbRiga.toString() );
sbRiga.setLength( 0 );
}
pw.flush();
} finally {
if (pw != null) {
try { pw.close(); } catch (Exception e) { }
} else {
if (bw != null) {
try { bw.close(); } catch (Exception e) { }
} else {
if (fw != null) {
try { fw.close(); } catch (Exception e) { }
}
}
}
}
} else {
// Se non ho nulla da scrivere, creo un file vuoto
fileOutput.createNewFile();
}
}
private static int[] calcolaDimensioneColonne(List<String[]> dati) {
int[] ret = new int[ dati.get(0).length ];
for(String[] riga : dati) {
for(int i=0; i<riga.length; i++) {
if (riga[i].length() > ret[i]) ret[i] = riga[i].length();
}
}
return ret;
}
private static String fill(String dato, int length) {
StringBuilder sb = new StringBuilder( dato );
while(sb.length() < length) sb.append(' ');
return sb.toString();
}
}
Il primo parametro del (unico) metodo pubblico è il File da creare.
Il secondo parametro è la lista di "righe" da scrivere: ciascuna riga è un array (quindi, un elenco di colonne)
Il terzo parametro è un intero che indica il numero di spazi di separazione tra una colonna e l'altra
Esempietti d'uso:
codice:
// Ho i miei dati come lista di array di stringhe
List<String[]> dati = ...;
// Scrivo su un file con 1 spazio di separazione tra le colonne
try {
IncolonnaSuFile.scriviFile(new File("primoFile.txt"), dati, 1);
} catch (Exception e) {
e.printStackTrace();
}
// Scrivo su un file con 3 spazi di separazione tra le colonne
try {
IncolonnaSuFile.scriviFile(new File("secondoFile.txt"), dati, 3);
} catch (Exception e) {
e.printStackTrace();
}
...
Ciao.