Domanda

Quale sarebbe il miglior approccio per analizzare un file delimitato quando le colonne sono sconosciuti prima che l'analisi del file?

Il formato del file è v3 Rightmove (.blm), gli sguardi struttura come questa:

#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#

I file possono essere potenzialmente molto grande, il file di esempio che ho è 40Mb ma potrebbero essere diverse centinaia di megabyte. Di seguito è riportato il codice che avevo iniziato a prima di realizzare le colonne erano dinamica, sto aprendo un FileStream come ho letto che era il modo migliore per gestire file di grandi dimensioni. Non sono sicuro che la mia idea di mettere ogni record in una lista, allora il trattamento è un bene, però, non so se questo funziona con tali file di grandi dimensioni.

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);
}

Tutte le idee su come farlo meglio? E 'C # 3.0 e .Net 3.5 se funziona.

Grazie,

Annelie

È stato utile?

Soluzione

Se si riesce a togliere alcune delle linee in partenza (il contenuto di intestazione e le # xxx # righe), allora è solo un file CSV con ^ come delimitatore, in modo che qualsiasi CSV classe lettore farà il trucco.

Altri suggerimenti

Si potrebbe fare questo un paio di modi.

  1. Se le proprietà sui vostri oggetti hanno lo stesso nome delle colonne nel file di dati, è possibile utilizzare la reflection per determinare le colonne devono corrispondere a quali proprietà.
  2. Se le proprietà sui vostri oggetti hanno nomi diversi, allora si potrebbe scrivere uno schema di mapping personalizzato che direbbe "per la colonna X, assegnare alla proprietà Y".
  3. È possibile creare attributi personalizzati per le proprietà degli oggetti che indicano che il nome della colonna che mappano, e l'uso di riflessione per leggere quegli attributi.

Tutti questi passaggi presuppone che i nomi di colonna nel file di dati sarà lo stesso per i dati che rappresentano (vale a dire, Indirizzo_1 sarà sempre il nome di colonna per i dati "linea di indirizzo uno").

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top