1

私は次の形式のテキストを持っていますが、フィールドをプロパティとして使用して、そこからユーザーオブジェクトを作成するのが最善の方法であるかどうか疑問に思いました。

正規表現をよく知らないので、csharpの文字列メソッド、特にIndexOfとLastIndexOfを調べていましたが、フィールドが約15あるので、面倒すぎると思います。

私はこれをCシャープで行おうとしています

いくつかの特徴:

  1. キー/フィールドは固定されており、事前にわかっているので、タイトル、会社などを探す必要があることを知っています
  2. アドレス部分は単一値であり、それに続いていくつかの複数値フィールドがあります
  3. 複数値のフィールドは、コンマ(、)で終わる場合とそうでない場合があります
  4. フィールド間には1つまたは2つのラインブレーキがあります。たとえば、「国」の後に「関心」に遭遇する前に2つのラインブレーキが続きます。
    タイトル:Mr
    会社:abcキャピタル
    住所1:42ミステリーレーン
    Zip:112312
    国:アイルランド
    興味:サイクリング、水泳、ハイキング、
    関心のあるトピック:ヨーロッパ、アジア、首都
4

3 に答える 3

1

これにより、データがキーと値のペアに分割され、辞書に保存されます。より多くの要件のためにさらに変更する必要があるかもしれません。

var dictionary = data
        .Split(
            new[] {"\r\n"}, 
            StringSplitOptions.RemoveEmptyEntries)
        .Select(x => x.Split(':'))
        .ToDictionary(
            k => k[0].Trim(), 
            v => v[1].Trim());
于 2012-07-19T20:30:38.283 に答える
0

私はおそらくこのようなもので行くでしょう:

    private Dictionary<string, IEnumerable<string>> ParseValues(string providedValues)
    {
        Dictionary<string, IEnumerable<string>> parsedValues = new Dictionary<string, IEnumerable<string>>();

        string[] lines = providedValues.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); //Your newline character here might differ, being '\r', '\n', '\r\n'...

        foreach (string line in lines)
        {
            string[] lineSplit = line.Split(':');
            string key = lineSplit[0].Trim();
            IEnumerable<string> values = lineSplit[1].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()); //Removing empty entries here will ensure you don't get an empty for the "Interest" line, where you have 'Hiking' followed by a comma, followed by nothing else
            parsedValues.Add(key, values);
        }

        return parsedValues;
    }

または、読みやすさと保守性は、大きな一連の呼び出しほどクールではないという概念に同意する場合は、次のようになります。

    private static Dictionary<string, IEnumerable<string>> ParseValues(string providedValues)
    {
        return providedValues.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Select(x => x.Split(':')).ToDictionary(key => key[0].Trim(), value => value[1].Split(new char[]{ ','}, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()));
    }
于 2012-07-19T21:23:10.803 に答える
0

これらのケースについては、正規表現をよりよく理解することを強くお勧めします。「半分」の構造化テキストの解析は非常に簡単で、正規表現を使用したロジックです。

例:これ(および他の以下は単なる変形であり、必要なものに応じてそれを行うための多くの方法があります)

title:\s*(.*)\s+comp.*?:\s*(.*)\s+addr.*?:\s*(.*)\s+zip:\s*(.*)\s+country:\s*(.*)\s+inter.*?:\s*(.*)\s+topic.*?:\s*(.*)

結果を出す

1.  Mr
2.  abc capital
3.  42 mystery lane
4.  112312
5.  Ireland
6.  Biking, Swimming, Hiking,
7.  Europe, Asia, Capital

または-よりオープンに:

\s(.*?):\s(.*)

入力を次のような適切なグループに解析します。

Match 1
1.  Title
2.  Mr
Match 2
1.  Company
2.  abc capital
Match 3
1.  Address1
2.  42 mystery lane
Match 4
1.  Zip
2.  112312
Match 5
1.  Country
2.  Ireland
Match 6
1.  Interest
2.  Biking, Swimming, Hiking,
Match 7
1.  Topic of Interest
2.  Europe, Asia, Capital

私はc#(およびその正規表現の方言)に精通していません、私はあなたの興味を目覚めさせたかっただけです...

于 2015-02-12T11:04:47.690 に答える