Question

Quelle serait la meilleure approche pour analyser un fichier délimité lorsque les colonnes ne sont pas connues avant l'analyse du fichier?

Le format de fichier est Rightmove v3 (.blm), l'aspect de la structure comme celle-ci:

#HEADER#
Version : 3
EOF : '^'
EOR : '~'
#DEFINITION#
AGENT_REF^ADDRESS_1^POSTCODE1^MEDIA_IMAGE_00~ // can be any number of columns
#DATA#
agent1^the address^the postcode^an image~
agent2^the address^the postcode^^~      // the records have to have the same number of columns as specified in the definition, however they can be empty
etc
#END#

Les fichiers peuvent potentiellement être très volumineux, le fichier exemple que j'ai est 40Mb, mais ils pourraient être plusieurs centaines de méga-octets. Voici le code que j'avais commencé avant que je réalisais les colonnes ont été dynamiques, je suis l'ouverture d'une filestream comme je l'ai lu c'était la meilleure façon de gérer des fichiers volumineux. Je ne suis pas sûr que mon idée de mettre tous les enregistrements dans une liste alors le traitement est tout bon cependant, ne sais pas si cela va fonctionner avec de tels fichiers volumineux.

List<string> recordList = new List<string>();

try
{
    using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
    {
        StreamReader file = new StreamReader(fs);
        string line;
        while ((line = file.ReadLine()) != null)
        {
            string[] records = line.Split('~');

            foreach (string item in records)
            {
                if (item != String.Empty)
                {
                    recordList.Add(item);
                }
            }

        }
    }
}
catch (FileNotFoundException ex)
{
    Console.WriteLine(ex.Message);
}

foreach (string r in recordList)
{
    Property property = new Property();

    string[] fields = r.Split('^');

    // can't do this as I don't know which field is the post code
    property.PostCode = fields[2];
    // etc

    propertyList.Add(property);
}

Toute idée de comment faire mieux? Il est C # 3.0 et .Net 3.5 si cela aide.

Merci,

Annelie

Était-ce utile?

La solution

Si vous pouvez enlever quelques-unes des lignes au début (le contenu d'en-tête et les # xxx # lignes), il est juste un fichier csv avec ^ comme séparateur, de sorte que toute lecteur CSV classe fera l'affaire.

Autres conseils

Vous pouvez le faire de plusieurs façons.

  1. Si les propriétés de vos objets ont le même nom que les colonnes de votre fichier de données, vous pouvez utiliser la réflexion pour déterminer les colonnes doivent être adaptées aux propriétés qui.
  2. Si les propriétés de vos objets ont des noms différents, vous pouvez écrire un schéma de mappage personnalisé qui dit « pour la colonne X, Y assign à la propriété ».
  3. Vous pouvez créer des attributs personnalisés pour vos propriétés d'objet qui indiquent le nom colonne à leur carte, et la réflexion utiliser pour lire ces attributs.

Toutes ces étapes présupposent que les noms de colonnes dans vos fichiers de données seront les mêmes pour les données qu'ils représentent (à savoir, ADDRESS_1 sera toujours le nom de la colonne pour les données « d'une ligne d'adresse »).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top