2009-04-11 7 views
4

Une modification des données dans le fichier txt. J'ai essayé le code suggéré mais je ne réussis pas à l'écrire de nouveau dans le fichier txt avec ce format. J'ai essayé le collection.sort mais il écrit les données en ligne longue.Comment trier les enregistrements dans un fichier texte en utilisant Java?

Mon fichier txt contiennent ces données:

Monday 
Jessica Run  20mins 
Alba  Walk  20mins 
Amy  Jogging 40mins 
Bobby Run  10mins 
Tuesday 
Mess  Run  20mins 
Alba  Walk  20mins 
Christy Jogging 40mins 
Bobby Run  10mins 

Comment puis-je trier ces données dans l'ordre croissant et le stocker à nouveau dans le fichier txt après le tri?

Monday 
Alba  Walk  20mins 
Amy  Jogging 40mins 
Bobby Run  10mins 
Jessica Run  20mins 
Tuesday 
Alba  Walk  20mins 
Bobby Run  10 mins 
Christy Jogging 40mins 
Mess  Run  20mins 
Jessica Run  20mins 

Répondre

2

En utilisant sort:

[email protected] ~$ sort data.txt 
Alba  Walk  20mins 
Amy  Jogging 40mins 
Bobby Run  10mins 
Jessica Run  20mins 

[email protected] ~$ sort data.txt > sorted.txt 
[email protected] ~$ cat sorted.txt 
Alba  Walk  20mins 
Amy  Jogging 40mins 
Bobby Run  10mins 
Jessica Run  20mins 

... ou en utilisant python:

[email protected] ~$ python -c "import sys; print ''.join(sorted(sys.stdin))" <data.txt> sorted.txt 
[email protected] ~$ cat sorted.txt 
Alba  Walk  20mins 
Amy  Jogging 40mins 
Bobby Run  10mins 
Jessica Run  20mins 
+0

bah ... ce n'était pas dans la question ... Je déteste quand les gens font ça. –

+0

hmm, Runtime.exec()? * canards * – Joey

+0

+1; il se peut qu'il ne réponde pas exactement à la question, mais si vous ne faites qu'une seule opération, l'utilisation de 'sort' économise l'écriture d'une application utilitaire. – Rob

3

ont une classe contenant 3 paramètres: Nom, Action, et la longueur.

Ouvrez votre fichier pour la lecture, lisez mot par mot, pour chaque personne, créez une nouvelle instance de la classe et remplissez la valeur appropriée, puis insérez cette instance dans une collection.

Trier votre collection soit en écrivant votre propre méthode de tri ou (La meilleure option) utiliser l'une des fonctions de tri Java. Ouvrez un autre fichier pour écrire et écrire votre collection triée dans la même fasion. Si vous ne pouvez pas traduire les actions ci-dessus en code, achetez le livre "Core JAVA" et lisez-le bien. J'espère que quelqu'un ici sera généreux et vous donnera un code complet. :)

+0

Typo dans le 3ème paragraphe (acheter -> par). Vous (et tout le monde - était-ce un ajout par l'édition?) Ont ignoré les jours de la semaine. – Tom

+0

Autant que je m'en souvienne, les jours de la semaine n'étaient pas là dans le post pré-édité. – user88637

0

S'il n'y a pas une quantité horrible de données dans ce fichier, essayez quelque chose comme ceci:

charge tout son contenu dans un

String s = <<file contents>>; 

String[] strings = s.split(<<here comes lovely regex something like \w+\s\w+\s\w>>); 

Arrays.sort(strings); 

for (String str : strings) { 
    write str to your output file; 
} 

mais je suis beaucoup trop fatiguée pour proposer quelque chose de plus raisonnable ....

15

Voici quelque chose que je suis venu avec:

import java.io.*; 
import java.util.*; 

public class Sort { 

    public static void main(String[] args) throws Exception { 
     BufferedReader reader = new BufferedReader(new FileReader("fileToRead")); 
     Map<String, String> map=new TreeMap<String, String>(); 
     String line=""; 
     while((line=reader.readLine())!=null){ 
      map.put(getField(line),line); 
     } 
     reader.close(); 
     FileWriter writer = new FileWriter("fileToWrite"); 
     for(String val : map.values()){ 
      writer.write(val); 
      writer.write('\n'); 
     } 
     writer.close(); 
    } 

    private static String getField(String line) { 
     return line.split(" ")[0];//extract value you want to sort on 
    } 
} 
+0

-1 pour ne pas prendre en charge les clés en double ... –

+0

Ne pas prendre en charge les clés en double. Bon point, mais si je pensais que c'était une exigence, je l'aurais écrit différemment. –

+0

après avoir ajouté le support de clés en double le code était très utile pour moi :) – Markus

4

Voici une façon assez paresseux de le faire puisque vous ne triez premier mot:

ArrayList<String> rows = new ArrayList<String>(); 
    BufferedReader reader = new BufferedReader(new FileReader("input.txt")); 

    String s; 
    while((s = reader.readLine())!=null) 
     rows.add(s); 

    Collections.sort(rows); 

    FileWriter writer = new FileWriter("output.txt"); 
    for(String cur: rows) 
     writer.write(cur+"\n"); 

    reader.close(); 
    writer.close(); 
3
import java.io.*; 
import java.util.*; 

public class Sort1 { 
    public static void main(String[] args) throws Exception { 
     BufferedReader reader = new BufferedReader(new FileReader("fileToRead.txt")); 
     Map<String, String> map=new TreeMap<String, String>(); 
     String line=""; 
     while((line=reader.readLine())!=null){ 
       map.put(getField(line),line); 
     } 
     reader.close(); 
     BufferedWriter writer = new BufferedWriter(new FileWriter("fileToWrite1.txt")); 
     for(String val : map.values()){ 
       writer.write(val);  
       writer.newLine(); 
     } 
     writer.close(); 
    } 

    private static String getField(String line) { 
     return line.split(" ")[0];//extract value you want to sort on 
    } 
} 
+0

j'ai changé le précédent pgm et obtenu le résultat .... – user464703

+0

l'essayer, il vous aidera ..... – user464703

4
package com.myFiles; 

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.ArrayList; 
import java.util.Collections; 

public class FilesReaderWriter { 
    public static void main(String[] args) throws IOException { 
     BufferedReader reader = null; 
     PrintWriter outputStream = null; 
     ArrayList<String> rows = new ArrayList<String>(); 

     try { 
      reader = new BufferedReader(new FileReader("Input.txt")); 
      outputStream = new PrintWriter(new FileWriter("Output.txt")); 

      String file; 
      while ((file = reader .readLine()) != null) { 
       rows.add(file); 
      } 
      Collections.sort(rows); 
      String[] strArr= rows.toArray(new String[0]); 
      for (String cur : strArr) 
       outputStream.println(cur); 
     } finally { 
      if (reader != null) { 
       inputStream.close(); 
      } 
      if (outputStream != null) { 
       outputStream.close(); 
      } 
     } 
    } 

} 
0

Cette solution utilise Java 8 API Stream.

Considérons que Files.write prend Stream<CharSequence> comme deuxième argument, donc nous avons besoin d'une conversion de type via map(Function.identity()).

import java.io.IOException; 
import java.nio.file.*; 
import java.util.function.Function; 
import java.util.stream.Stream; 

public class FileSortWithStreams { 

    public static void main(String[] args) throws IOException { 
     Path initialFile = Paths.get("files/initial.txt"); 
     Path sortedFile = Paths.get("files/sorted.txt"); 

     Stream<CharSequence> sortedLines = Files.lines(initialFile).sorted().map(Function.identity()); 

     Files.write(sortedFile, sortedLines::iterator, StandardOpenOption.CREATE); 
    } 
} 
Questions connexes