|
|
|
![]() |
|
Strumenti |
![]() |
#1 | |
Member
Iscritto dal: Dec 2006
Messaggi: 185
|
[Java] Problema in lettura di un file di testo
Salve a tutti, ho un problema con questo programma in Java:
devo aprire in lettura il seguente file di testo, leggerlo tutto ed estrapolare da esso le intere righe che mi interessano e scriverle su un altro file. Le righe che interessano sono SOLO QUELLE che indicano operazioni svolte dall'amministratore in questo file di Log. Potete darmi una mano? Non capisco perchè non funziona... ![]() ![]() Quote:
Codice:
import java.io.*; import java.lang.*; import java.util.*; class Log { public static void main (String args[]) { int a=1; char thischar=' '; //char per la lettura di un singolo carattere String s=null; //string per la lettura di una linea try { FileReader f = new FileReader("protezione2.txt"); BufferedReader fIN = new BufferedReader(f); FileWriter f2 = new FileWriter("EventLog.txt",true); PrintWriter fOUT = new PrintWriter(f2); s=fIN.readLine(); System.out.println(s); do { while(fIN.read()!=-1){ thischar=(char) fIN.read(); System.out.print(thischar); if(thischar=='A') { //SE il carattere è 'A' thischar=(char) fIN.read(); //leggi il carattere successivo if(thischar=='d') { //SE il carattere successivo è 'd' thischar=(char) fIN.read(); //leggi il carattere successivo fOUT.println(s); }}} s=fIN.readLine(); } while(s!=null); } catch(IOException e) { System.out.println("Si e' verificata un'eccezione "+e.getMessage()); }}} Ultima modifica di Xizor : 07-07-2009 alle 09:29. |
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Riposto il codice, identato in modo da redere il tutto più leggibile:
Codice:
import java.io.*; import java.lang.*; import java.util.*; class Log { public static void main (String args[]) { int a=1; char thischar=' '; //char per la lettura di un singolo carattere String s=null; //string per la lettura di una linea try { FileReader f = new FileReader("protezione2.txt"); BufferedReader fIN = new BufferedReader(f); FileWriter f2 = new FileWriter("EventLog.txt",true); PrintWriter fOUT = new PrintWriter(f2); s=fIN.readLine(); System.out.println(s); do { while(thischar!='?') { thischar=(char) fIN.read(); System.out.print(thischar); if(thischar=='A') { //SE il carattere è 'A' thischar=(char) fIN.read(); //leggi il carattere successivo if(thischar=='d') { //SE il carattere successivo è 'd' thischar=(char) fIN.read(); //leggi il carattere successivo fOUT.println(s); } } } s=fIN.readLine(); } while(s!=null); } catch(IOException e) { System.out.println("Si e' verificata un'eccezione "+e.getMessage()); } } } - sia che le operazioni di I/O vadano a buon fine oppure no, gli stream non vengono chiusi. Invece per quanto riguarda il codice che rappresenta la logica di estrazione delle stringhe desiderate: - notiamo che ogni stringa è formata sempre da 8 campi (Tipo,Data,Ora,Origine,Categoria,Evento,Utente,Computer) separati dal carette di virgola, e quello che ci interessa è il campo Utente (il settimo): quando è uguale alla stringa "Amministratore" l'intera riga letta va inserita nel nuovo file. - potresti realizzare semplicemente la cosa usando un oggetto java.util.Scanner che supporta il parsing di String mediante uno o più delimitatori personalizzabili: nel tuo caso, dato un oggetto String che rappresenta una riga del file di input, il delimitatore per il parsing è il carattere ','. Come procederei io: - tramite BufferedReader leggo tutte le righe del file di input e le salvo in un array di String; chiudo il file di input. - creo una java.util.List<String> che conterrà le String da scrivere nel nuovo file di output. - ciclo l'array di String, per ogni String nell'array: tramite uno Scanner (con delimitatore personalizzato sul carattere di virgola) faccio il parsing della String per prendere il settimo 'token' e confrontarlo con la String "Administrator": se è uguale allora lo aggiungo alla java.util.List<String>. - ciclo la lista di String e tramite un PrintWriter le scrivo tutte sul file di output; chiudo il file di output.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 07-07-2009 alle 09:49. |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Dec 2006
Messaggi: 185
|
Giusto
![]() Prima del catch ma dentro il try ho messo Codice:
f.close(); f2.flush(); f2.close(); |
![]() |
![]() |
![]() |
#4 | |
Member
Iscritto dal: Dec 2006
Messaggi: 185
|
Quote:
E' come StringTokenizer? |
|
![]() |
![]() |
![]() |
#5 |
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
...potresti scorrere riga per riga e controllare se all'interno esiste la stringa "administrator" senza controllare carattere per carattere...inoltre se usi java 5 puoi utilizzare uno scanner...
Codice:
Scanner in = new Scanner(new File("/home/user/miofile")); while(in.hasNextLine()) { String line = in.nextLine(); if(in.nextLine().indexOf("administrator")>-1) System.out.println(line); } |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Dec 2006
Messaggi: 185
|
La lettura delle righe nel file di input va effettuata in un ciclo while(true) ? Cioè, leggere fino a che non finisce il file?
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
In tal caso sfrutti il metodo readLine che torna una String contente la riga letta, altrimenti torna null (e vuol dire che hai già letto tutte le righe). Quindi imposti un ciclo su questa condizione: finchè la riga letta è diversa da null.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
![]() |
![]() |
![]() |
#9 | |
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
Quote:
...ciao Andrea... |
|
![]() |
![]() |
![]() |
#10 | |
Member
Iscritto dal: Dec 2006
Messaggi: 185
|
Codice:
int i=0; String s=null; String lines[] = new String[1000]; try { FileReader f = new FileReader("protezione2.txt"); BufferedReader fIN = new BufferedReader(f); s=fIN.readLine(); while(s!=null) { i++; s=fIN.readLine(); lines[i]=s; } f.close(); } catch(IOException e) { System.out.println("Si e' verificata un'eccezione "+e.getMessage()); } ![]() Quote:
![]() |
|
![]() |
![]() |
![]() |
#11 | |
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
Quote:
...ciao Andrea... |
|
![]() |
![]() |
![]() |
#12 | |
Member
Iscritto dal: Dec 2006
Messaggi: 185
|
Quote:
s=fIN.readLine(); //leggo la prima riga while(s!=null) { //verifico che non sia finito il file lines[i]=s; //assegno la riga a ciascun elemento dell'array i++; //incremento l'indice dell'array s=fIN.readLine(); //assegno ad s la riga letta } f.close(); //chiudo il file di input }CODE] Giusto, grazie ![]() Ultima modifica di Xizor : 07-07-2009 alle 10:32. |
|
![]() |
![]() |
![]() |
#13 |
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
...c'è un altro errorino legato al counter dell'array...infine l'uso di un array inizializzato ad un valore standard puo' creare problemi...
...ciao Andrea... |
![]() |
![]() |
![]() |
#14 |
Member
Iscritto dal: Dec 2006
Messaggi: 185
|
Codice:
s=fIN.readLine(); //leggo la prima riga while(s!=null) { //verifico che non sia finito il file lines[i]=s; //assegno la riga a ciascun elemento dell'array i++; //incremento l'indice dell'array s=fIN.readLine(); //assegno ad s la riga letta } f.close(); //chiudo il file di input } Per quanto riguarda l'inizializzazione non è obbligatorio inizializzare l'indice? |
![]() |
![]() |
![]() |
#15 | |
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
Quote:
...ciao Andrea... |
|
![]() |
![]() |
![]() |
#16 | |
Member
Iscritto dal: Dec 2006
Messaggi: 185
|
Quote:
Codice:
Vector line = new Vector(); while(s!=null) { //verifico che non sia finito il file line.addElement(s); //assegno la riga a ciascun elemento dell'array i++; //incremento l'indice dell'array s=fIN.readLine(); //assegno ad s la riga letta } ![]() |
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Mi corrego in una cosa rispetto alla procedura passo-passo che ho detto che avrei seguito:
invece di leggere tutto il file di input in un array di String per poi estrarre dall'array le String interessanti e memorizzarle su una java.util.List<String> per poi iterare su di essa farei così: leggo tutto il file di input creando subito la List<String>; procedo iterando sulla lista e rimuovendo tutte le String che non mi interessano; quindi scrivo la List così depurata nel file di output. In 2 parole: java.util.List è un'interfaccia che rappresenta una collezione ordinata di elementi ovvero una sequenza ; permette all'utente l'accesso a un elemento della sequenza tramite il suo indice, nonchè la possibilità di inserire un elemento in un punto preciso; inoltre l'utente può eseguire una ricerca specificando l'elemento richesto e ottentendo come risposta la prima posizione trovata (se l'elemento è presente). List permette l'inserimento di elementi duplicati (cioè uguali). Fornisce all'utente un java.util.Iterator per eseguire l'iterazione della lista, inoltre fornisce lo speciale ListIterator (ha delle capacità in più rispetto al solito iteratore). Fa parte della Collection Framework inclusa nel JDK della Sun, racchiusa nel package java.util (cha ha anche altre utilità oltre le Collection). Un'implementazione di una List (che appunto è solo un'interfaccia) da usare nel tuo caso potrebbe essere ArrayList (questa è una classe che implementa List). Il fatto di dire che vogliamo una List<String> significa dire che gli elementi della lista saranno di tipo String. Questa feature si chiama "Generics" ed è stata introdotta da Java 5. Fatti un giro nella javadoc a dai un occhio alla descrizione del package java.util. Esempio s'uso: Codice:
// creo una lista di stringhe, inzialmente vuota; List<String> inputFile = new ArrayList<String>(); // supponiamo che 'reader' sia un BufferedReader di un file di testo aperto in lettura String line = reader.readLine(); while(line != null) { inputFile.add(line); line = reader.readLine(); } Codice:
// inputFile è la lista di prima, il costrutto for che uso qui sotto è un // costrutto speciale introdotto con i Generics. // Puoi leggerlo così: per ogni String 'line' in 'inputFile'... (in pratica è una sorta di for each) for (String line : inputFile) System.out.println(line); Codice:
Iterator<String> iterator = inputFile.iterator(); while (iterator.hasNext()) { String line = iterator.next(); if (line.indexOf("Administrator") != -1) iterator.remove(); } Potresti anche usare Vector, solo che Vector rispetto a List è un pochino meno performante, poichè Vector ha i metodi sincronizzati per potere essere utilizzato in contesti di multithreading, mentre List no.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 08-07-2009 alle 11:43. |
![]() |
![]() |
![]() |
#18 | |
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
Quote:
...ciao Andrea... |
|
![]() |
![]() |
![]() |
#19 | |
Member
Iscritto dal: Dec 2006
Messaggi: 185
|
Quote:
|
|
![]() |
![]() |
![]() |
#20 | |
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
Quote:
...ciao Andrea... |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:39.