Supposons que vous souhaitiez écrire une application traitant plusieurs fichiers texte, fournis en tant qu'arguments sur la ligne de commande (par exemple MyProcessor file1 file2 ...). C'est une tâche très courante pour laquelle Perl est souvent utilisé, mais que se passe-t-il si l'on veut profiter directement de .NET et utiliser C#. Quel est le code de plaque de chaudière d'application C# 4.0 le plus simple qui vous permet de faire cela? Il devrait inclure le traitement ligne par ligne de chaque ligne de chaque fichier et faire quelque chose avec cette ligne, en appelant une fonction pour le traiter ou peut-être une meilleure façon de faire ce genre de traitement de ligne "group" (par exemple, LINQ ou une autre méthode).Traitement de plusieurs fichiers texte C#
Répondre
Vous pouvez traiter les fichiers en parallèle par la lecture de chaque ligne et le passage à une fonction de traitement:
class Program
{
static void Main(string[] args)
{
Parallel.ForEach(args, file =>
{
using (var stream = File.OpenRead(file))
using (var reader = new StreamReader(stream))
{
string line;
while ((line = reader.ReadLine()) != null)
{
ProcessLine(line);
}
}
});
}
static void ProcessLine(string line)
{
// TODO: process the line
}
}
Maintenant, il suffit d'appeler: SomeApp.exe file1 file2 file3
Avantages de cette approche:
- Les fichiers sont traités en parallèle => en tirant parti de plusieurs cœurs de processeur
- Les fichiers sont lus ligne par ligne et que la ligne actuelle est maintenue en mémoire ce qui réduit la consommation de mémoire et vous permet de travailler avec de gros fichiers
Une solution très intéressante je dois dire. Je suppose que rendre le traitement non parallèle ne serait pas trop dur non plus? –
+1 Pour utiliser le dernier concept Parallel – TalentTuner
@Michael: Il suffit d'échanger le Parallel.ForEach avec une boucle foreach standard ... –
Simple;
foreach(var f in args)
{
var filecontent = File.ReadToEnd();
//Logic goes here
}
Avez-vous déjà raison ce code? et à quoi cela résout-il – TalentTuner
résoudre le problème de la lecture de plusieurs fichiers, où leur chemin a été passé à travers les arguments –
Malheureusement, ReadToEnd chargera le fichier entier en mémoire. Cela est prohibitif pour les gros fichiers. La clé ici est de traiter efficacement le fichier une ligne à la fois, indépendamment de la taille du fichier. –
Après beaucoup expérimenter, changer cette ligne dans la réponse de Darin Dimitrov:
using (var stream = File.OpenRead(file))
à:
using (var stream=new FileStream(file,System.IO.FileMode.Open,
System.IO.FileAccess.Read,
System.IO.FileShare.ReadWrite,
65536))
pour changer la taille de la mémoire tampon de lecture à partir de la valeur par défaut de 4 Ko à 64 Ko peuvent raser jusqu'à 10% de réduction du temps de lecture du fichier w hen lit "line at a time" via un lecteur de flux, surtout si le fichier texte est grand. Les tailles de mémoire tampon plus importantes ne semblent pas améliorer davantage les performances.
Cette amélioration est présente, même lors de la lecture à partir d'un SSD relativement rapide. Les économies sont encore plus substantielles si un HD ordinaire est utilisé. Fait intéressant, vous obtenez cette amélioration significative des performances même si le fichier est déjà mis en cache par le système d'exploitation (Windows 7/2008R2), ce qui est quelque peu contre-intuitif.
- 1. ffmpeg traitement de plusieurs fichiers
- 2. Traitement des fichiers C++
- 3. Erreur lors du traitement de plusieurs fichiers
- 4. C - Lire plusieurs fichiers
- 5. Traitement de fichiers MD5
- 6. Comment ajouter du texte à plusieurs fichiers
- 7. lire plusieurs fichiers en utilisant le multi-traitement
- 8. Traitement de macro C
- 9. C#: gérer plusieurs fichiers App.config
- 10. traitement Excel en C#
- 11. Lire plusieurs fichiers texte dans un dossier
- 12. Remplacement de texte pour plusieurs fichiers de script/config
- 13. Ouverture de plusieurs fichiers (OpenFileDialog, C#)
- 14. Ouverture de plusieurs fichiers en C++
- 15. Traitement de fichiers avec Workflow Foundation
- 16. Recherche de plusieurs chaînes dans plusieurs fichiers
- 17. Suppression de texte multiligne à partir de plusieurs fichiers
- 18. Extraction de texte à partir de fichiers PDF en C#
- 19. Exécution d'un script de traitement par lots Windows pour démarrer plusieurs fichiers
- 20. Traitement des fichiers Adobe Illustrator
- 21. Traitement d'erreurs courantes C#
- 22. Comment diviser un fichier texte en plusieurs fichiers?
- 23. Traitement des fichiers dans ABAP
- 24. Traitement de plusieurs instructions IF Javascript
- 25. Traitement de fichiers avec Elastic MapReduce - Pas d'étape de réduction?
- 26. Django et traitement de fichiers statiques
- 27. Lecture de fichiers texte
- 28. Traitement: Pourquoi setup() s'exécute plusieurs fois?
- 29. C# 2.0 - Liste de traitement
- 30. Traitement de l'image Objective C
Je pense que vous essayez de trop compliquer les choses. Il suffit de plonger et de commencer à écrire votre code, d'ajouter une logique «framework» lorsque la complexité l'exige, et non plus tôt. – Juliet
Allez-vous passer le chemin du fichier dans les arguments de la ligne de commande? – TalentTuner