2010-03-01 7 views
0

Quelle est la plus rapide à ce qui suit en C# 3.5:Iterate les fichiers et lire les enregistrements

  1. Itérer dans les fichiers dans un répertoire
  2. Lire les enregistrements du fichier (longueur fixe de 247 caractères)
  3. Convertissez la chaîne de longueur fixe de chaque enregistrement en une structure ou une classe.

Merci

+4

le plus rapide en termes de temps de performance ou de développement? – Manu

+0

Je pense que vous venez de décrire l'algorithme: parcourir tous les fichiers dans un répertoire, lire une ligne à la fois, avoir une classe dont le constructeur accepte une chaîne et extrait les données appropriées. Puisque vous voulez lire toutes les données, toute autre approche ne fera qu'ajouter un surcoût. –

+0

le plus rapide en termes de performance, comme j'ai besoin de lire des milliers d'enregistrements par minute – Dave

Répondre

0

Ce serait relativement rapide à écrire:

var myStructs = 
from file in Directory.GetFiles(".", "*.*", SearchOption.TopDirectoryOnly) 
select ConvertFileToStructs(File.ReadAllText(file)); 

Si c'est le moyen le plus rapide possible, en terme de performance? Probablement pas, mais cela ne fera pas une énorme différence. Ce qui aura un impact sur les performances, c'est l'implémentation de la désérialisation dans la fonction ConvertFileToStructs(). Mais pour y répondre, nous devons connaître le format spécifique de vos fichiers.


Il vous suffit de lire vos commentaires. Je suggère l'analyse suivante:

List<MyStruct> ConvertFileToStructs(string content, int[] mapping) 
{ 
    var records = new List<MyStruct>(); 
    int length = content.Length(); 
    for(int i = 0; i < length; i += 247) 
     records.Add(ConvertRecordToStruct(content.Substring(i,247), mapping)); 
    return records; 
} 

MyStruct ConvertRecordToStruct(string record, int[] mapping) 
{ 
    MyStruct s; 
    s.Field1 = record.Substring(mapping[0], mapping[1]); 
    //set other fields 
    return s; 
} 

Ce code pourrait probablement être optimisé pour la performance, mais je ne pense pas que cela changerait les choses de façon spectaculaire, en particulier parce que les E/S sur le disque est impliqué et Substring() est assez rapide (voir http://dotnetperls.com/substring). Bien sûr, vous devrez tester cela sur votre machine.

+0

Que devriez-vous savoir sur le format des fichiers? Ce sont des fichiers texte d'une longueur fixe de 247 pour chaque enregistrement. – Dave

+0

De votre question, j'ai compris que vous voulez convertir l'enregistrement en une structure ou une classe, ce qui implique qu'ils représentent un objet sérialisé. Ma question est si le format de sérialisation est XML, CSV ou autre chose. Parce que c'est important si vous parser avec un analyseur XML, string simple.Split et Join ou expressions régulières. Peut-être que vous avez l'intention que la chaîne ne devrait pas être analysée plus loin, mais alors pourquoi une conversion? – Manu

+0

mon plan initial est de lire chaque enregistrement, convertir la chaîne de longueur fixe en une structure ou classe .. faire un peu de traitement .. puis insérer dans un DB avec linq. mais comment convertir l'enregistrement de longueur fixe en un Struct? – Dave

0

classe personnalisée pour gérer les fichiers

class customFile 
     { 
      string fileText; 
      public string FileText 
      { 
       get { return fileText; } 
       set { fileText = value; } 
      } 
     } 

lire tout le texte

 string[] filePaths = Directory.GetFiles(dirPath); 
     List<customFile> customFiles = new List<customFile>(); 
     foreach (string file in filePaths) 
     { 
      customFiles.Add(new customFile { FileText = File.ReadAllText(file) }); 
     } 
Questions connexes