2

ファイルを解析する前に列が不明な場合、区切りファイルを解析する最良の方法は何ですか?

ファイル形式は Rightmove v3 (.blm) で、構造は次のようになります。

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

ファイルは非常に大きくなる可能性があります。私が持っているサンプル ファイルは 40Mb ですが、数百メガバイトになる可能性があります。以下は、列が動的であることに気付く前に開始したコードです。大きなファイルを処理するための最良の方法であると読んだときに、ファイルストリームを開いています。すべてのレコードをリストに入れて処理するという私の考えはよくわかりませんが、それがそのような大きなファイルで機能するかどうかはわかりません。

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

これをより良くする方法のアイデアはありますか?それが役立つ場合は、C# 3.0 と .Net 3.5 です。

ありがとう、

アネリー

4

2 に答える 2

1

最初の行の一部(ヘッダーコンテンツと#xxx#行)を削除^できる場合、それは区切り文字としてのcsvファイルであるため、CSVリーダークラスであればどれでもうまくいきます。

于 2010-05-06T16:28:53.437 に答える
1

これにはいくつかの方法があります。

  1. オブジェクトのプロパティがデータ ファイルの列と同じ名前である場合、リフレクションを使用して、どの列をどのプロパティに一致させる必要があるかを判断できます。
  2. オブジェクトのプロパティの名前が異なる場合は、「列 X をプロパティ Y に割り当てる」というカスタム マッピング スキーマを作成できます。
  3. どの列名にマップするかを示すオブジェクト プロパティのカスタム属性を作成し、リフレクションを使用してそれらの属性を読み取ることができます。

これらの手順はすべて、データ ファイル内の列名が、それらが表すデータと同じであることを前提としています (つまり、ADDRESS_1 は常に「住所 1 行目」のデータの列名になります)。

于 2010-05-06T16:24:57.223 に答える