2010-11-22 10 views
6

J'essaie de lire un fichier java et de le modifier simultanément. Voilà ce que je dois faire: Mon dossier est du format:JAVA: lire et écrire un fichier ensemble

aaa 
bbb 
aaa 
ccc 
ddd 
ddd 

je dois lire le fichier et obtenir le nombre de # d'occurrences et de modifier les doublons pour obtenir le fichier suivant:

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

J'ai essayé d'utiliser le RandomAccessFile pour cela, mais je n'ai pas pu le faire. Quelqu'un peut-il m'aider avec le code pour celui-ci?

Répondre

8

C'est beaucoup plus facile si vous ne faites pas deux choses en même temps. Le meilleur moyen est de parcourir le fichier entier, de compter toutes les occurrences de chaque chaîne dans un hachage, puis d'écrire tous les résultats dans un autre fichier. Ensuite, si nécessaire, déplacez le nouveau fichier par-dessus l'ancien.

Vous ne voulez plus jamais lire et écrire dans le même fichier en même temps. Vos décalages dans le fichier changeront à chaque fois que vous faites une écriture et le curseur de lecture ne gardera aucune trace de cela.

+0

Ceci est aussi ma pensée, il m'a juste fallu trop de temps pour le taper avec du travail dans le chemin! –

+1

bien le problème est que le fichier que j'ai est beaucoup trop grand. Garder en mémoire juste ne fonctionnera pas .. Et donc, hastables sont une mauvaise idée .. Je n'ai pas d'autre choix que de recourir aux opérations de fichiers :(Mauvaise idée, mais ne pas avoir d'autre go .. – sharath

+0

Quelle est la longueur de la plus longue chaîne? Cela prendrait un peu moins de place et si vous avez beaucoup de chevauchement dans les termes, cela prendrait beaucoup moins de place.Dans le pire des cas, vous devriez vraiment utiliser une base de données, plutôt que d'écrire les vôtres. –

0

Si vous devez le faire, vous pouvez manipuler le même fichier et mettre à jour les compteurs sans devoir ouvrir un autre fichier ou conserver tout en mémoire. Cependant, la plus simple des approches serait très lente.

1

Je le ferais de cette façon: - Analyser le fichier original et enregistrer toutes les entrées dans un nouveau fichier. Utilisez des blocs de données de longueur fixe pour écrire des entrées dans le nouveau fichier (par exemple, votre chaîne la plus longue est de 10 octets, prenez 10 + x comme longueur de bloc, x pour les informations supplémentaires que vous voulez enregistrer le long des entrées. dans le fichier serait à la position octet 10 * (10 + x)). Vous auriez également besoin de connaître le nombre d'entrées pour créer le (donc la taille du fichier serait noOfEntries * blocklength, utilisez un RandomAccesFile et setLength pour définir la longueur de ce fichier). - Maintenant, utilisez l'algorithme de tri rapide pour trier les entrées dans le fichier (mon idée est d'avoir un fichier trié à la fin ce qui rend les choses beaucoup plus faciles et plus rapides finalement.) Hashing fonctionnerait théoriquement aussi, mais vous auriez à réorganiser entrées alors d'avoir tous les doublons groupés - pas vraiment un choix ici). - Analyser le fichier avec les entrées maintenant triées. Enregistrez un pointeur sur l'entrée de la première occurrence d'une entrée. Incrémentez le nombre de doublons jusqu'à ce qu'il y ait une nouvelle entrée. Changez la première entrée et ajoutez les informations supplémentaires que vous voulez avoir dans un nouveau fichier "résultat final". Continuez ainsi avec toutes les entrées restantes dans le fichier trié. Conclusions: Je pense que cela devrait être raisonnablement rapide et utiliser une quantité raisonnable de ressources. Cependant, cela dépend des données que vous avez. Si vous avez un très grand nombre de doublons, les performances de quicksort se dégraderont. En outre, si votre entrée de données la plus longue est beaucoup plus longue que la moyenne, elle gaspillera également de l'espace fichier.

-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){} 
      } 
     } 
    } 
Questions connexes