Itérer les fichiers et lire les enregistrements
-
23-09-2019 - |
Question
Quelle est la plus rapide à ce qui suit en C # 3.5:
- itérer les fichiers dans un répertoire
- Lire les enregistrements du fichier (longueur fixe de 247 caractères)
- Convertir la chaîne de longueur fixe de chaque enregistrement à une structure ou classe.
Merci
La solution
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 il ne fera pas une énorme différence. Ce qui aura un impact sur les performances est la mise en œuvre de la désérialisation au sein de la fonction ConvertFileToStructs (). Mais pour répondre à cela, nous avons besoin de connaître le format spécifique de vos fichiers.
Il 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 le tester sur votre machine.
Autres conseils
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) });
}