Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22
  1. #1

    [Java] Eseguire un'operazione su molti file

    Salve gente, sto facendo un programmino in java che deve leggere molti file excel di una directory.
    Ora riesco a leggerne uno solo, dato che gli passo la directory in cui si trova il file con l'istruzione
    codice:
    InputStream input = new FileInputStream("D:\\Documents and Settings\\nome.xls");
    Io vorrei generalizzare il tutto in modo da dirgli di prendere tutti i file .xls presenti nella directory, come faccio?

    Se riuscissi a risolvere questo problema, poi avrei altre richieste dato che mi sono bloccato....

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    se guardi le api java noti che se apri un file con il path della directory, da questa puoi ottenere l'elenco di tutti i file che contiene. Ti basta ciclare su quest'elenco per ottenere quello che vuoi.

    Dai un'occhio alle API java su File

  3. #3
    Io ho usato le librerie POI.

    Ecco il codice che ho scritto:
    codice:
    public static void main( String [] args ) {
    		
    		try {
    			//Apriamo uno stream per recuperare il file
    			InputStream input = new FileInputStream("D:\\Documents and Settings\\......\\file.xls");
    						
    			//e lo rendiamo utilizzabile dalle librerie POI
    			POIFSFileSystem fs = new POIFSFileSystem(input);
    			
    			//un file excel è un WorkBook contenente diversi fogli
    			HSSFWorkbook wb = new HSSFWorkbook(fs);
    			
    			//di cui ne leggiamo il primo
    			HSSFSheet sheet = wb.getSheetAt(0);
    			Iterator rows = sheet.rowIterator();
    Come potrei modificarlo per fargli leggere tutti i file?

  4. #4
    Originariamente inviato da Fabietto206
    Come potrei modificarlo per fargli leggere tutti i file?
    Ad esempio:
    codice:
    public static void elaboraFile(File xls) {
        try {
                 //Apriamo uno stream per recuperare il file
    	     InputStream input = new FileInputStream( xls );
    						
    	     //e lo rendiamo utilizzabile dalle librerie POI
    	     POIFSFileSystem fs = new POIFSFileSystem(input);
    
                 // ....
    
          // ....
    }
    
    public static void main(String args[]) {
             File mainDir = new File( dirContenenteFilesXLS ); // path directory che contiene tutti i files che devi elaborare
             File files[] = mainDir.listFiles( filtroFileXls ); // devi decidere se utilizzare un FilenameFilter o FileFilter in modo tale da caricare solo i files .xls
             for( File xls : files )
                   elaboraFile(xls);
    }
    Per saperne di più: listFiles().

  5. #5
    Allo stato attuale il mio codice è il seguente:
    codice:
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Collection;
    import java.util.HashMap;
    
    import org.apache.poi.poifs.filesystem.POIFSFileSystem;
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    
    
    public class FromXLS  {
    	
                  //Oggetto Hash Map
    	HashMap hMap = new HashMap();
    	
    
    	@SuppressWarnings("deprecation")
    	public static void main( String [] args ) {
    		
    		try {
    			//Apriamo uno stream per recuperare il file
    			InputStream input = new FileInputStream("D:\\.....\\file.xls");
    			
    			//e lo rendiamo utilizzabile dalle librerie POI
    			POIFSFileSystem fs = new POIFSFileSystem(input);
    			
    			//un file excel è un WorkBook contenente diversi fogli
    			HSSFWorkbook wb = new HSSFWorkbook(fs);
    			
    			//di cui ne leggiamo il primo
    			HSSFSheet sheet = wb.getSheetAt(0);
    			Iterator rows = sheet.rowIterator();
    			
    			//Iteriamo su tutte le righe del foglio
    			while( rows.hasNext() ) {
    				HSSFRow row = (HSSFRow) rows.next();
    				if (row.getRowNum() == 6)
    					System.out.println( "N. Riga = " + row.getRowNum() );
    				Iterator cells = row.cellIterator();
    				
    				while( cells.hasNext() ) {
    					//Per ogni riga scorriamo tutte le celle
    					HSSFCell cell = (HSSFCell) cells.next();
    					System.out.println( "N. Cella = "
    							+ cell.getCellNum() );
    					
    					
    					
    					/*Per ogni cella verifichiamo la tipologia del dato 
    					 * che contiene e lo scriviamo nel canale di output */
    					switch ( cell.getCellType() ) {
    					//Tipo numerico
    					case HSSFCell.CELL_TYPE_NUMERIC:
    						if (cell.getNumericCellValue() != 0)
    							System.out.println((int)cell.getNumericCellValue() );
    						break;
    					//Tipo stringa
    					case HSSFCell.CELL_TYPE_STRING:
    						//if (cell.getStringCellValue() == "KEY" && cell.getStringCellValue() == "TOT")
    							System.out.println(cell.getStringCellValue() );
    						break;
    					//Tipo formula
    					case HSSFCell.CELL_TYPE_FORMULA:
    						if (cell.getNumericCellValue() != 0)
    							System.out.println((int)cell.getNumericCellValue());
    						break;
    					//Altro
    					default:
    						System.out.println("unsuported cell type" );
    						break;
    					}
    				}
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }
    Io dovrei fare in modo che legga una serie di file .xls contenuti in una certa directory.
    Deve creare una Hash Map in cui il campo chiave sia una determinata colonna e il campo valore sia un numero che viene incrementato.
    Consigli su come operare?

  6. #6
    Originariamente inviato da Fabietto206
    Io dovrei fare in modo che legga una serie di file .xls contenuti in una certa directory.
    Fin qui ci siamo .. e penso che la soluzione precedente soddisfi tale esigenza.

    Originariamente inviato da Fabietto206
    Deve creare una Hash Map in cui il campo chiave sia una determinata colonna e il campo valore sia un numero che viene incrementato.
    Se per ogni file .xls devi ottenere una mappa, allora il metodo elaboraFile deve restituire una istanza di HashMap, che poi andrai a salvare da qualche parte insieme alle altre.

    Invece, se la mappa è unica per tutti i files .xls da leggere, qui hai varie soluzioni alternative:
    - definisci un ulteriore parametro di tipo HashMap nel metodo elaboraFile (quindi l'unica istanza di HashMap verrà passata per ogni file .xls letto).
    - rendi l'istanza di HashMap un campo di istanza, con la conseguenza che elaboraFile deve essere un metodo di istanza.
    - rendi l'istanza di HashMap un campo di classe, quindi elaboraFile deve essere un metodo di classe.

  7. #7
    Di ogni file xls a me interessa la 5 e la 7 colonna e basta, in particolare la 5 colonna sarà la "chiave", mentre la 7 è il "valore" (contiene un'int).
    Il file xls è formato da molte righe, ogni xls ha lo stesso numero di righe e le stesse "chiavi", differiscono solo per il campo "valore".

    Il programma deve incrementare il "valore" ogni volta che incontra la stessa "chiave" nei xls successivi.

    Sono stato chiaro?

    @VincenzoTheBest: potresti spiegarmi meglio la soluzione che hai proposto? Credo che quella composta dai 3 punti possa fare al caso mio sicuramente...dato che alla fine devo avere un'unica Hash Map con le "chiavi" da una parte e la somma di ogni "valore" dall'altra....

  8. #8
    Ecco come sono fatti i file xls:


    Uploaded with ImageShack.us

    A me interessano solo i campi KEY e TOT, quindi ogni volta che negli xls successivi si incontra la stessa KEY, il valore del campo TOT deve essere sommato a quello incontrato.....

  9. #9
    Originariamente inviato da Fabietto206
    Di ogni file xls a me interessa la 5 e la 7 colonna e basta, in particolare la 5 colonna sarà la "chiave", mentre la 7 è il "valore" (contiene un'int).
    Il file xls è formato da molte righe, ogni xls ha lo stesso numero di righe e le stesse "chiavi", differiscono solo per il campo "valore".
    Se usi una versione >= 5, puoi definire la tua istanza di HashMap avvalendoti delle Generics:
    codice:
    Map<String, Integer> map = new HashMap<String, Integer>();
    perchè la colonna 5 contiene stringhe, invece la 7 contiene interi.

    Originariamente inviato da Fabietto206
    Il programma deve incrementare il "valore" ogni volta che incontra la stessa "chiave" nei xls successivi.
    In generale, puoi definire un algoritmo simile a quello per il calcolo della frequenza di ogni elemento ..

    Originariamente inviato da Fabietto206
    @VincenzoTheBest: potresti spiegarmi meglio la soluzione che hai proposto? Credo che quella composta dai 3 punti possa fare al caso mio sicuramente...dato che alla fine devo avere un'unica Hash Map con le "chiavi" da una parte e la somma di ogni "valore" dall'altra....
    Nel secondo caso, si tratta di tre soluzioni alternative proposte in funzione del metodo elaboraFile, quindi nessuno ti vieta, ad esempio, di fare:
    codice:
    public class YourClass {
             public static Map<String, Integer> getResultMap(File[] files) {
                      HashMap<String, Integer> map = new HashMap<String, Integer>();
                      for(File file : files) {
                           // aggiungi a map i dati dell'i-esimo file ..
                      }
                      return map;
             }
    }
    Se proprio ti convince la seconda soluzione:
    rendi l'istanza di HashMap un campo di istanza, con la conseguenza che elaboraFile deve essere un metodo di istanza.
    codice:
    public class YourClass {
             private Map<String, Integer> map;
    
             public YourClass() {
                 this.map = new HashMap<String, Integer>();
             }
    
             public void addData(File xls) {
                      // aggiungi i valori di questo files a map
             }
    
             // lo invochi quando hai estratto i dati di tutti i files
             public Map<String, Integer> getResultMap() {
                      return this.map;
             }
    }

  10. #10
    Sono a questo punto:
    codice:
    public class FromXLS  {
    	
    	//Oggetto Hash Map
    	Map<String, BigDecimal> map = new HashMap<String, BigDecimal>();
    	
    	//Metodo che prende in input un file excel ed estrae il contenuto di righe e colonne
    	@SuppressWarnings("deprecation")
    	public static void elaboraFile(File xls){
    		try {
    			//Apriamo uno stream per recuperare il file
    			InputStream input = new FileInputStream(xls);
    			
    			//e lo rendiamo utilizzabile dalle librerie POI
    			POIFSFileSystem fs = new POIFSFileSystem(input);
    			
    			//un file excel è un WorkBook contenente diversi fogli
    			HSSFWorkbook wb = new HSSFWorkbook(fs);
    			
    			//di cui ne leggiamo il primo
    			HSSFSheet sheet = wb.getSheetAt(0);
    			Iterator rows = sheet.rowIterator();
    			
    			//Iteriamo su tutte le righe del foglio
    			while( rows.hasNext() ) {
    				HSSFRow row = (HSSFRow) rows.next();
    				System.out.println( "N. Riga = " + row.getRowNum() );
    				Iterator cells = row.cellIterator();
    				
    				while( cells.hasNext() ) {
    					//Per ogni riga scorriamo tutte le celle
    					HSSFCell cell = (HSSFCell) cells.next();
    					if (cell.getCellNum() == 2 || cell.getCellNum() == 5)
    						System.out.println( "N. Cella = "
    						+ cell.getCellNum() );
    					/*Per ogni cella verifichiamo la tipologia del dato 
    					 * che contiene e lo scriviamo nel canale di output */
    					switch ( cell.getCellType() ) {
    					//Tipo numerico
    					case HSSFCell.CELL_TYPE_NUMERIC:
    						if (cell.getCellNum() == 2 || cell.getCellNum() == 5)
    							System.out.println((int)cell.getNumericCellValue() );
    						break;
    					//Tipo stringa
    					case HSSFCell.CELL_TYPE_STRING:
    						if (cell.getCellNum() == 2 || cell.getCellNum() == 5)
    							System.out.println(cell.getStringCellValue() );
    						break;
    					//Tipo formula
    					case HSSFCell.CELL_TYPE_FORMULA:
    						if (cell.getCellNum() == 2 || cell.getCellNum() == 5)
    							System.out.println((int)cell.getNumericCellValue());
    						break;
    					//Altro
    					default:
    						if (cell.getCellNum() == 2 || cell.getCellNum() == 5)
    							System.out.println("unsuported cell type" );
    						break;
    					}
    				}
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	
    	public static void main(String args[]) {
    		//Directory contenente tutti i file .xls da elaborare
    		File mainDir = new File("pathname");
            File files[] = mainDir.listFiles(......); // devi decidere se utilizzare un FilenameFilter o FileFilter in modo tale da caricare solo i files .xls
            //Per tutti i file della directory
            for( File xls : files )
            	elaboraFile(xls);
    	}
    }
    Non ho capito cosa devo inserire come parametro alla riga
    codice:
    File files[] = mainDir.listFiles(......);
    tu cosa mi consigli di usare?

    Ora (a parte qualche errore dovuto al file filter sbagliato) mi legge tutti i file della directory specificata e mi stampa solo quelli delle colonne 2 e 5.

    Adesso dovrei applicare l'hashMap (mi è stato consigliato di usare il BigDecimal al posto di Integer). Come mi consigli di operare?
    Non ho ben capito i tuoi 2 esempi delle classi.....

    PS: Mi è stato detto di usare i metodi get, put, ecc...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.