2010-09-15 5 views
0

J'ai un très gros fichier texte, et mon programme iPad doit parfois remplacer une seule ligne de données (nouvelle ligne: '\ n'). Comment puis-je le faire efficacement? Écrire le fichier entier en même temps n'est pas une option. J'ai regardé dans NSFileHandle, et il semble qu'il fera ce que je veux; En ce moment j'ai du mal à trouver comment trouver la ligne X, puis la remplacer par les données d'une chaîne. Je pense qu'après cela, tout ce que j'ai besoin de faire est d'appeler synchronizeFile, non?Remplacer une ligne dans un fichier

J'apprécie votre aide!

Répondre

1

Vous ne pouvez pas vraiment faire cela sans écrire le fichier entier. Vous pouvez chercher au début de la ligne et ensuite écrire la nouvelle ligne. Mais d'abord vous devriez trouver le décalage de cette ligne. Si vous n'avez pas déjà cela, cela signifie lire le fichier depuis le début jusqu'à cette ligne. Ensuite, vous pouvez écrire la nouvelle ligne, mais seulement si elle est exactement la même longueur que la ligne d'origine. Si elle est plus longue, elle écrasera la ligne suivante - il n'y a aucun moyen d'insérer des données dans un fichier. Si la nouvelle ligne est plus courte que l'ancienne, la fin de l'ancienne ligne restera. La même exigence de longueur est également délicate. Cela signifie la même longueur en octets. Selon l'encodage des caractères, certains caractères peuvent nécessiter plus d'octets que d'autres.

Si vous avez vraiment besoin de le faire et le faire fonctionner pour presque tous les cas, vous auriez à utiliser ces étapes:

  1. Lire le fichier entier pour trouver le décalage de la ligne qui vous intéresse dans
  2. Seek au décalage de la ligne
  3. Ecrire la nouvelle ligne
  4. Ecrivez le reste du fichier que vous lisez à l'étape 1.

Cet algorithme fonctionnera, peu importe la longueur ou la longueur des lignes ou leur encodage. Mais ce sera probablement plus cher que de simplement écrire le fichier entier, surtout si vous l'avez en mémoire de toute façon.

Avez-vous vérifié qu'il n'est pas acceptable d'écrire tout le fichier ou faites-vous une optimisation prématurée ici? Si votre fichier texte est vraiment gros, vous devriez considérer une base de données, comme SQLite, ou utiliser des données de base.

+0

Une base de données serait bien, mais malheureusement, cela ne fonctionnera pas; l'application est conçue pour mettre à jour une base de données massive csv. Je suppose qu'il serait possible pour l'application de convertir le fichier csv en base de données pour un fonctionnement normal, et de reconvertir la base de données en commande csv, mais convertir le tableau en format chaîne pour l'écriture est cher pour la taille du fichier csv , et pourrait conduire à des erreurs de la part des personnes qui récupèrent le fichier csv de l'application. – JoBu1324

+0

Convertir la base de données csv en un tableau est en fait relativement peu coûteux - j'ai trouvé une bibliothèque C décente pour faire la plupart du travail assez rapidement. Il faut environ 1 seconde pour ouvrir le fichier et le convertir en un tableau multidimensionnel. Utiliser -stringByAppendingString: ou -stringByAppendingFormat: recompose le fichier csv est la partie la plus coûteuse, et cela prend au moins une minute (je n'ai jamais pris la peine de savoir combien de temps ça dure, 1 seconde peut être acceptable, mais 2 secondes seraient trop long). Est-ce que la conversion de NSStrings en c-strings ou en NSData rendrait la composition du fichier csv plus rapide? D'autres idées? – JoBu1324

+0

Utilisez-vous vraiment 'stringByAppendingFormat:' pour recréer le fichier CSV entier en une seule chaîne? Cela doit ralentir, car toute la chaîne à laquelle vous ajoutez doit être copiée à chaque fois. Utiliser un 'NSMutableString' à la place devrait accélérer les choses, surtout si vous l'initialisez en utilisant' initWithCapacity: 'pour réserver suffisamment d'espace. Au lieu de construire tout le contenu en une seule chaîne, il pourrait même être plus rapide d'écrire le fichier ligne par ligne. – Sven

Questions connexes