1

我有以下格式的文本,我想知道最好的方法是从它创建一个用户对象,并将字段作为其属性。

我不太了解正则表达式,我正在查看 csharp 中的字符串方法,特别是 IndexOf 和 LastIndexOf,但我认为这太混乱了,因为大约有 15 个字段。

我正在尝试在 c 中执行此操作

一些特点:

  1. 键/字段是固定的并且事先已知,所以我知道我必须寻找诸如标题、公司等之类的东西
  2. 地址部分是单值的,然后是一些多值字段
  3. 多值字段可以/不可以以逗号 (,) 结尾
  4. 字段之间有一个或两个线刹车,例如“国家”之后是 2 个线刹车,然后我们遇到“兴趣”
    头衔:先生
    公司:abc资本
    地址1:神秘巷42号
    邮编: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

对于这些情况,我强烈建议您对正则表达式更加熟悉。使用常规 exp 解析“半”结构化文本非常简单且符合逻辑。

例如。这个(以及其他以下只是变体,有很多方法可以根据您的需要进行操作)

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 回答