Frage

Was ist der beste Ansatz wäre, eine getrennte Datei zu analysieren, wenn die Spalten sind nicht bekannt, bevor die Datei Parsen?

Das Dateiformat ist Rightmove v3 (.blm), die Struktur sieht wie folgt aus:

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

Die Dateien können potenziell sehr groß sein, wird die Beispieldatei Ich habe 40Mb ist, aber sie konnten mehrere hundert Megabyte sein. Unten ist der Code, den ich auf begonnen hatte, bevor ich die Säulen waren dynamisch realisiert, ich bin ein Filestream öffnen, wie ich, dass der beste Weg, um große Dateien zu handhaben lesen war. Ich bin nicht sicher, ob meine Idee jeden Datensatz in einer Liste setzt dann die Verarbeitung ist aber jeder gut, weiß nicht, ob das mit so großen Dateien arbeiten.

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

Alle Ideen, wie dies besser zu machen? Es ist C # 3.0 und .NET 3.5, ob das hilft.

Danke,

Annelie

War es hilfreich?

Lösung

Wenn Sie zu Beginn einige der Linien Streifen aus können (der Inhalt des Headers, und die # xxx # Zeilen), dann nur, es ist eine CSV-Datei mit ^ als Trennzeichen, so dass jeder CSV-Reader-Klasse den Trick.

Andere Tipps

Man könnte dies ein paar Möglichkeiten tun.

  1. Wenn die Eigenschaften auf Ihre Objekte den gleichen Namen wie die Spalten in Ihrer Datendatei haben, könnten Sie Reflektion verwenden, um zu bestimmen, welche Spalten auf, welche Eigenschaften angepasst werden.
  2. Wenn die Eigenschaften auf Ihren Objekten unterschiedliche Namen haben, dann könnten Sie ein benutzerdefiniertes Zuordnungsschema schreiben, die „für die Spalte X, assign auf Eigenschaft Y“ sagen würden.
  3. Sie könnten erstellen benutzerdefinierte Attribute für Ihre Objekteigenschaften, die die Spaltennamen sie zur Karte anzuzeigen, und die Verwendung Reflexion dieser Attribute zu lesen.

Alle diese Schritte setzen voraus, dass die Spaltennamen in Datendateien werden die gleichen für die Daten sein, die sie repräsentieren (das heißt, ADDRESS_1 wird immer der Spaltenname für „Adresszeile ein“ Daten).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top