2010-08-16 4 views
2

Quelqu'un peut-il recommander un moyen rapide de trier le contenu d'un fichier texte, basé sur le premier X nombre de caractères de chaque ligne? Par exemple, si j'ai dans le fichier texte, le texte suivantUn moyen rapide de trier par ordre alphabétique le contenu d'un fichier dans Java

Adrian Graham some more text here 

John Adams  some more text here 

Puis un autre enregistrement doit être inséré pour par exemple.

Bob Something some more text here 

J'ai besoin de garder le fichier trié, mais cela est un assez grand fichier et je préfère ne pas charger entièrement en mémoire à la fois. En gros, je veux dire environ 500 000 lignes, donc peut-être pas très énorme.

J'ai fait une recherche autour et trouvé http://www.codeodor.com/index.cfm/2007/5/14/Re-Sorting-really-BIG-files---the-Java-source-code/1208 et je voulais savoir si quelqu'un pourrait suggérer d'autres manières? Pour avoir des opinions secondaires?

Mon idée initiale avant de lire l'article lié ci-dessus était:

Lire le fichier

diviser en plusieurs fichiers, par exemple A à Z

Si une ligne commence par « une » alors il est écrit dans le fichier appelé A.txt

Chacun des fichiers ont alors leur contenu trié (aucune idée claire comment pour l'instant en dehors de l'ordre alphabétique)

Puis quand il s'agit de lire des données, je sais que si je veux trouver une ligne qui commence par A puis j'ouvre A.txt Lors de l'insertion d'une nouvelle ligne, la même chose s'applique et je viens d'ajouter à la fin du fichier . Plus tard après l'insertion quand il y a le temps je peux invoquer mon programme de tri pour réorganiser les fichiers qui ont eu des choses ajoutées à eux.

Je me rends compte qu'il y a quelques défauts dans cela comme par exemple. il n'y aura pas un nombre pair de lignes qui commencent par une lettre particulière, donc certains fichiers peuvent être plus gros que d'autres etc.

Encore une fois, pourquoi ai-je besoin d'un deuxième avis pour des suggestions sur la façon d'aborder cela? Le programme actuel est en Java, mais n'importe quel langage de programmation pourrait être utilisé pour un exemple qui permettrait d'atteindre cet objectif ... Je vais porter ce dont j'ai besoin.

(Si quelqu'un se demande je ne suis pas délibérément essayer de me donner un mal de tête en stockant les informations de cette façon, j'ai hérité un petit programme douloureux qui stocke les données dans les fichiers au lieu d'utiliser une sorte de base de données) Merci à l'avance

+0

Si vous êtes ouvert à la division de fichiers, pourquoi ne pas vous ouvrir (temporairement) au stockage dans une base de données? –

+0

Parce que j'ai 3 jars, le programme principal, certains utilitaires et le 3ème jar qui gère le stockage et la récupération de fichiers J'ai seulement la source pour le programme principal ... à la fois le pot principal et le pot util interagissent avec le troisième jar ce qui signifie que je ne peux hériter et remplacer les différentes méthodes dont il existe un certain nombre et lectures et écritures aléatoires que j'ai trouvé dans le programme qui n'ont pas encore de sens ar rendant encore plus difficile de supprimer les fichiers et branchez un db. C'est un soft mal écrit et il est évident qu'ils n'avaient aucune intention de le retravailler ... – zcourts

+0

En gros je ne vois pas comment ajouter simplement un db sans réécriture massive que j'essaye d'éviter. – zcourts

Répondre

2

Vous pouvez aussi simplement appeler la commande DOS "sort" pour trier le fichier. C'est rapide et ne nécessitera presque aucune programmation de votre part.

Dans une zone DOS, tapez help sort|more pour la syntaxe de tri et les options.

+0

ce serait une bonne astuce, mais il a fonctionné sur un bureau ubuntu ... bien que mon environnement dev est windows :) – zcourts

+0

@ robinsonc494, je ne suis pas un expert en ubuntu, mais n'a-t-il pas une commande similaire? – BoltBait

+0

fait probablement, je vais y jeter un coup d'oeil, merci. Je n'utilise pas Linux souvent comme un environnement de bureau. donc je ne suis pas expert non plus mais je vais vérifier dans une minute et voir si ils ont une telle chose. merci encore – zcourts

1

500 000 ne devraient pas vraiment être autant à trier. Lisez le tout dans la mémoire, puis triez-le en utilisant les fonctions intégrées standard. Je vous trouve vraiment que ceux-ci sont trop lents, puis passer à quelque chose de plus compliqué. 500.000 lignes x environ 60 octets par ligne ne finissent toujours que 30 megs.

+0

C'est vrai mais c'est un fichier en croissance et je voulais prendre en compte les tailles futures. – zcourts

+0

peut-être que c'est une optimisation prématurée pour essayer de résoudre un problème qui n'existe pas. Probablement mieux pour surveiller l'application. Et attendez de voir quand la vitesse et/ou l'utilisation de la mémoire devient un problème, et corrigez-le ensuite. – Kibbee

+0

point pris sur l'optimisation prématurée, mais le fait reste que je dois au moins trier les données qui existent déjà – zcourts

0

Une autre option pourrait être de lire le fichier et le mettre dans un db léger (par exemple hsqldb in file mode)

ensuite obtenir les données triées et écrire de nouveau à un fichier. (Ou simplement migrer vers un programme, donc il utilise un db)

+0

je pourrais donner un coup de feu bien que ma dernière rencontre avec hsqldb n'était pas trop agréable. – zcourts

Questions connexes