簡體   English   中英

將文本解析為鍵/值對或json

[英]parse text into key/value pair or json

我的文本格式如下,我想知道最好的方法是從字段中將其作為屬性從中創建用戶對象。

我不太了解正則表達式,我在看csharp中的字符串方法,尤其是IndexOf和LastIndexOf,但是我認為這太混亂了,因為大約有15個字段。

我正在嘗試使用C Sharp

一些特點:

  1. 鍵/字段是固定的,並且事先已知,因此我知道我必須查找標題,公司等內容
  2. 地址部分是單值的,其后是一些多值字段
  3. 多值字段可以/可以不以逗號(,)結尾
  4. 場之間存在一兩個線制動器,例如在遇到“興趣”之前,“國家”之后是兩個線制動器
Title: Mr
    Company: abc capital
    Address1: 42 mystery lane
    Zip: 112312
    Country: Ireland
    Interest: Biking, Swimming, Hiking,
    Topic of Interest: Europe, Asia, Capital

這會將數據拆分為鍵值對,並將其存儲在字典中。 您可能需要進一步修改才能滿足更多要求。

var dictionary = data
        .Split(
            new[] {"\r\n"}, 
            StringSplitOptions.RemoveEmptyEntries)
        .Select(x => x.Split(':'))
        .ToDictionary(
            k => k[0].Trim(), 
            v => v[1].Trim());

我可能會選擇這樣的東西:

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

對於這些情況,我強烈建議您更熟悉機智的正則表達式。 解析“半”結構化文本非常容易,並且具有常規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#(及其正則表達式的方言),我只是想喚醒您的興趣...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM