解析文本到键/值对或JSON

问题描述:

我有以下格式的文本,我想知道什么是最好的方法可能是从它创建一个用户对象作为其属性的字段。解析文本到键/值对或JSON

我不知道正则表达式,以及我正在查看csharp中的字符串方法,特别是IndexOf和LastIndexOf,但我认为这会太麻烦,因为有大约15个字段。

我试图做到这一点在C尖锐

一些特征:

  1. 的键/场是固定的,预先知道的,所以我知道我必须寻找的东西像头衔,公司等
  2. 地址部分是单值并遵循有一些多值字段
  3. 的多值字段可以/ maynot用逗号结束(,)
  4. 有领域如之间的一个或两个线路刹车“国家”之后是2个线刹车,我们遇到的“利息”
 
    Title: Mr 
    Company: abc capital 
    Address1: 42 mystery lane 
    Zip: 112312 
    Country: Ireland 
    Interest: Biking, Swimming, Hiking, 
    Topic of Interest: Europe, Asia, Capital 
+0

这似乎可能是缺少'作业'标签? – 2012-07-19 20:01:55

+0

我希望这是家庭作业,我的公司从他们的网站在电子邮件中获取这些数据,并手动输入到数据库中,谈论生产力 – 2012-07-19 20:08:53

我可能会像这样的东西去:

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

这个工程,谢谢,虽然你忘了添加键,值对字典parsedValues – 2012-07-19 21:35:48

+0

哈!当然,谢谢。固定! – 2012-07-19 23:13:04

这将向上分割数据到键值对,并将其存储在一个字典中前。您可能需要进一步修改以获取更多要求。

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

我试了一下,有什么不对劲,这是开始传入你的代码的字符串 “名称:先生\ n公司:Nappertandy资本\ nAddress1:4 Willbrook别墅\ nAddress2:\ nCity:都柏林\ NSTATE:N/A \ nProvince:\ nZip:14 \ nCountry:爱尔兰” 字典想出了只有一个键入为“标题”,值为“Mr \ nCompany” – 2012-07-19 21:17:53

我强烈推荐在这些情况下使用更多的机智正则表达式。解析“半”结构化文本非常简单,并且具有常规exp的逻辑。

for ex。这(和其他以下只是变种有许多方面,它取决于你需要做什么)

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#(及其正则表达式的方言),我只是想唤醒你的兴趣...