動的数の列で大きな区切りファイルを解析します
-
03-10-2019 - |
質問
ファイルを解析する前に列が不明な場合、区切りファイルを解析するための最良のアプローチは何ですか?
ファイル形式は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ですが、数百メガバイトである可能性があります。以下は、列が動的であることに気付く前に始めたコードです。大きなファイルを処理するための最良の方法であると読んでFilestreamを開いています。すべてのレコードをリストに載せるという私の考えはわかりませんが、処理は何らかの良いことです。それがそのような大きなファイルで機能するかどうかはわかりません。
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です。
ありがとう、
アネリー
解決
開始時にいくつかの行(ヘッダーコンテンツと#xxx#行)を削除できる場合、それは単なるCSVファイルです ^
デリミッターとして、だから CSVリーダークラス トリックをします。
他のヒント
これをいくつかの方法で行うことができます。
- オブジェクトのプロパティがデータファイルの列と同じ名前を持っている場合、反射を使用して、どの列をどの列をどのプロパティと一致させるかを決定できます。
- オブジェクトのプロパティに異なる名前がある場合、「列xの場合はプロパティyに割り当てる」と言うカスタムマッピングスキーマを記述できます。
- オブジェクトプロパティのカスタム属性を作成して、どの列名をマップするかを示すカスタム属性を作成し、反射を使用してそれらの属性を読み取ることができます。
これらの手順はすべて、データファイルの列名が表すデータに対して同じであることを前提としています(つまり、address_1は常に「アドレス行1」データの列名になります)。
所属していません StackOverflow