Moyen efficace pour supprimer une ligne d'un fichier texte
J'ai besoin de supprimer une ligne d'un fichier texte. Quel est le moyen le plus efficace de le faire? Le fichier peut être potentiellement importants(plus de millions d'enregistrements).
Mise à JOUR:
ci-dessous le code que j'utilise actuellement, mais je ne suis pas sûr si c'est bon.
internal void DeleteMarkedEntries() {
string tempPath=Path.GetTempFileName();
using (var reader = new StreamReader(logPath)) {
using (var writer = new StreamWriter(File.OpenWrite(tempPath))) {
int counter = 0;
while (!reader.EndOfStream) {
if (!_deletedLines.Contains(counter)) {
writer.WriteLine(reader.ReadLine());
}
++counter;
}
}
}
if (File.Exists(tempPath)) {
File.Delete(logPath);
File.Move(tempPath, logPath);
}
}
Si vous avez un tel grand magasin de données, pourquoi n'utilisez-vous pas un "vrai" de la base de données? Est-ce une limitation en ce que les outils dont vous disposez, de vos compétences actuelles ou les spécifications de votre projet?
C'est une exigence "d'en haut". En utilisant réel de la base de données serait plus facile pour moi, mais malheureusement, je ne peux pas l'utiliser.
Il n'est pas bon, il y a un bug désolé : (Voir ma réponse ci-dessous
C'est une exigence "d'en haut". En utilisant réel de la base de données serait plus facile pour moi, mais malheureusement, je ne peux pas l'utiliser.
Il n'est pas bon, il y a un bug désolé : (Voir ma réponse ci-dessous
OriginalL'auteur Valentin | 2009-02-10
Vous devez vous connecter pour publier un commentaire.
La plus simple façon de le faire est sans doute le meilleur, écrire l'intégralité du fichier dans un nouveau fichier, écrire toutes les lignes sauf celle(s) que vous ne voulez pas.
Vous pouvez également ouvrir le fichier pour un accès aléatoire.
Lecture au point où vous voulez "supprimer" de la ligne.
Passer la ligne à supprimer, et de lire un nombre d'octets (y compris les CR + LF - si nécessaire), écrire un nombre d'octets sur la ligne supprimée, avance deux endroits par le nombre d'octets et répéter jusqu'à la fin du fichier.
Espère que cette aide.
MODIFIER - Maintenant que je peux voir votre code
Ne fonctionnera pas, si c'est la ligne que vous ne voulez pas, vous voulez continuer à lire, tout simplement pas l'écrire. Le code ci-dessus ne sera ni le lire ou l'écrire. Le nouveau fichier sera exactement la même que l'ancienne.
Vous voulez quelque chose comme
OriginalL'auteur Binary Worrier
Fichiers texte sont séquentiels, de sorte que lors de la suppression d'une ligne, vous devez déplacer toutes les lignes suivantes.
Vous pouvez utiliser des fichiers de mapping (un win32 api que vous pouvez appeler par PInvoke) pour faire de cette opération un peu moins pénible, mais vous surelly doit savoir l'utilisation d'une structure séquentielle pour vous le fichier de sorte que vous pouvez marquer une ligne comme supprimé sans vraiment le supprimer de la file... Surtout si il doit arriver foire.
Si j'ai souvenir de Mappage de Fichier Api doit être ajoutée .Net 4.
OriginalL'auteur thinkbeforecoding
OriginalL'auteur Rajkumar
Si vous avez absolument ont pour utiliser un fichier texte et ne peut pas passer à une base de données, peut-être que vous souhaitez désigner un symbole bizarre au début d'une ligne pour dire "ligne supprimée". Juste avoir votre analyseur ignorer ces lignes, comme des lignes de commentaires dans les fichiers de config etc.
Alors un périodique "compact" de routine comme Outlook, et la plupart des systèmes de base de données, ce qui ré-écrit l'intégralité du fichier à l'exclusion des lignes supprimées.
Je vous encourage vivement à aller à Réfléchir Avant de coder la réponse de recommander une base de données ou un autre fichier structuré.
OriginalL'auteur Bork Blatt
Selon ce exactement qui est considéré comme "suppression", la meilleure solution pourrait être de remplacer la ligne incriminée par des espaces. Pour de nombreux usages (y compris la consommation humaine), c'est l'équivalent de la suppression de la ligne pure et simple. Si la ligne vide est un problème, et vous êtes sûr que vous ne serez jamais à supprimer la première ligne, vous pouvez ajouter les espaces de la ligne précédente par l'écrasement de la CRLF avec deux espaces.
(Basé sur le commentaire de Bork Blatt réponse)
OriginalL'auteur MSalters
Vous déplacer le fichier vers la mémoire à l'aide du Mappage de Fichier, comme Réfléchir Avant De Coder l'a fait, et fait des suppressions sur la mémoire et après l'écriture sur le disque.
Lire ce Lire Le Fichier D'Indicateurs De Référence - C#
C# accès du fichier de la carte mémoire
OriginalL'auteur lsalamon
Dans mon blog, j'ai comparé les différentes méthodes d'e/S à partir de C# afin de déterminer le moyen le plus efficace de faire fichier I/O. En général, vous êtes mieux d'utiliser le Windows ReadFile et WriteFile fonctions. La prochaine méthode la plus rapide pour lire les fichiers dans est par le biais de FileStream. Pour obtenir de bonnes performances, lire les fichiers en blocs à la fois au lieu d'une ligne à la fois et ensuite faire votre propre analyse. Le code que vous pouvez télécharger à partir de mon blog vous donne un exemple sur la façon de le faire. Il y a aussi une classe C# qui encapsule la Windows ReadFile /WriteFile fonctionnalités et est très facile à utiliser. Voir mon blog pour plus de détails au:
http://designingefficientsoftware.wordpress.com/2011/03/03/efficient-file-io-from-csharp
Bob Bryan CMDD
OriginalL'auteur Bob Bryan
Lire votre fichier dans un Dictionnaire non supprimer les lignes de l'int de 0
en ligne, vous devez marquer comme étant supprimés set int à 1. Utiliser un KeyValuePair pour extraire le
les lignes qui n'ont pas besoin d'être supprimé et les écrire dans un nouveau fichier.
.
OriginalL'auteur willjr20