2010-11-22 20 views
6

Estoy tratando de leer un archivo java y modificarlo simultáneamente. Esto es lo que tengo que hacer: Mi archivo tiene el formato:JAVA: leer y escribir un archivo juntos

aaa 
bbb 
aaa 
ccc 
ddd 
ddd 

tengo que leer a través del archivo y obtener el recuento del # de ocurrencias y modificar los duplicados para obtener el siguiente archivo:

aaa - 2 
bbb - 1 
ccc - 1 
ddd - 2 

He intentado usar el RandomAccessFile para hacer esto, pero no pude hacerlo. ¿Puede alguien ayudarme con el código para este?

Respuesta

8

Es mucho más fácil si no haces dos cosas al mismo tiempo. La mejor manera es recorrer todo el archivo, contar todas las ocurrencias de cada cadena en un hash y luego escribir todos los resultados en otro archivo. Luego, si es necesario, mueva el archivo nuevo sobre el anterior.

Nunca se desea leer y escribir en el mismo archivo al mismo tiempo. Sus desplazamientos dentro del archivo cambiarán cada vez que realice una escritura y el cursor de lectura no hará un seguimiento de eso.

+0

Esta es mi idea también, me tomó demasiado tiempo escribirla con el trabajo en el camino! –

+1

Bueno, el problema es que el archivo que tengo es demasiado grande. Mantenerlo en la memoria simplemente no funciona ... Y, por lo tanto, los hastables son una mala idea ... No tengo más remedio que recurrir a las operaciones de archivo :(Mala idea, pero no tengo otra ... – sharath

+0

¿Cuánto dura la cadena más larga? podría usar un trie. Tomaría un poco menos de espacio y si tiene muchos solapamientos en términos, tomaría mucho menos espacio. En el peor de los casos, debería usar una base de datos, en lugar de escribir la suya. –

0

Si es necesario, hay maneras en que puede manipular el mismo archivo y actualizar los contadores, sin tener que abrir otro archivo o mantener todo en su memoria. Sin embargo, el más simple de los enfoques sería muy lento.

1

lo haría de esta manera: - analizar el archivo original y guardar todas las entradas en un archivo nuevo. Utilice bloques de datos de longitud fija para escribir entradas en el nuevo archivo (por ejemplo, su cadena más larga tiene 10 bytes de longitud, tome 10 + x como longitud de bloque, x es la información adicional que desea guardar junto con las entradas. en el archivo estaría en la posición de bytes 10 * (10 + x)). También necesitaría saber la cantidad de entradas para crear (para que el tamaño del archivo sea noOfEntries * blocklength, use RandomAccesFile y setLength para establecer la longitud de este archivo). - Ahora usa el algoritmo de quicksort para ordenar las entradas en el archivo (mi idea es tener un archivo ordenado al final que haga las cosas mucho más fáciles y más rápidas finalmente. Hashing también teóricamente funcionaría, pero tendrías que lidiar con la reorganización de duplicados entradas para agrupar todos los duplicados, no es realmente una elección aquí). - Analice el archivo con las entradas ahora ordenadas. Guarde un puntero a la entrada de la primera aparición de una entrada. Incremente la cantidad de duplicados hasta que haya una nueva entrada. Cambie la primera entrada y agregue esa información adicional que desea tener allí en un nuevo archivo de "resultado final". Continúe de esta manera con todas las entradas restantes en el archivo ordenado.

Conclusiones: Creo que esto debería ser un razonablemente rápido y utilizan cantidad razonable de recursos. Sin embargo, depende de los datos que tenga. Si tiene una gran cantidad de duplicados, el rendimiento de la conexión rápida se degradará. Además, si la entrada de datos más larga es mucho más larga que la media, también perderá espacio en el archivo.

-2
import java.util.*; 
import java.io.*; 
import java.util.*; 
class WordFrequencyCountTest 
{ 
public static void main(String args[]) 
{ 
System.out.println(" enter the file name"); 
Scanner sc = new Scanner(System.in); 
String fname= sc.next();  
    File f1 = new File(fname); 


    if(!f1.exists()) 
    { 
     System.out.println(" Source file doesnot exists"); 
     System.exit(0); 
    } 
    else{ 
     try{     
      FileReader fis = new FileReader(f1); 
      BufferedReader br = new BufferedReader(fis); 
      String str = ""; 
      int count=0; 
     Map<String, Integer> map = new TreeMap<String, Integer>(); 
      while((str = br.readLine()) != null) 
      { 
       String[] strArray = str.split("\\s"); 
       count=1; 
       for(String token : strArray) // iteration of strArray [] 
       {      
       if(map.get(token)!=null) 
      { 
         count=map.get(token); 
         count++; 
         map.put(token, count); 
         count=1; 
        }else{ 
         map.put(token, count); 

        } 
       } 
      } 

      Set set=map.entrySet(); 
      Iterator itr = set.iterator();  
      System.out.println("========"); 

      while(itr.hasNext()) 
      { 
       Map.Entry entry = (Map.Entry)itr.next(); 

       System.out.println(entry.getKey()+ " "+entry.getValue()); 
      }    
      fis.close();    
     }catch(Exception e){} 
      } 
     } 
    } 
Cuestiones relacionadas