如何解析没有分隔符的键值对的字符串?

Posted

技术标签:

【中文标题】如何解析没有分隔符的键值对的字符串?【英文标题】:How do I parse a string for key value pairs with no delimiters? 【发布时间】:2020-01-30 05:22:02 【问题描述】:

如何在 C# 中解析字符串以提取键值对,而键和值之间没有任何分隔符?

我有一个看起来像这样的字符串

string str = "\nFIRSTNAMEJOHN\nLASTNAMESMITH\nADDRESS1590 GRACE STREET\nBIRTHDATE04201969"

在 \n 上拆分后,我得到一个字符串集合,看起来像

string[] properties = ["FIRSTNAMEJOHN","LASTNAMESMITH", etc.]

我想遍历这些字符串的拆分数组并从每个单独的字符串中提取键值对,以便我可以填充对象的属性,例如...

Person person = new Person() 
 FIRSTNAME = JOHN,
  LASTNAME = SMITH,
  etc...

这样做最干净的方法是什么?谢谢!

【问题讨论】:

您从中获取数据的原因是什么导致数据没有分隔符?您确定其中没有不可打印的字符作为分隔符吗? 你可以用一种相当直接的方式来做这件事。首先,我使用了您的字符串输入。我创建了一个名为 FieldNames 的公共枚举。为了获取字符串值,我创建了一个名为 EnumStringValue 的类,它允许您为每个枚举成员创建一个属性。最后,我创建了一个 ParseString 方法,它接受一个字符串输入。它像以前一样在 '\n' 上拆分,但在此方法中,它调用 ParseLine 方法,该方法获取拆分数组中的每个项目。如果需要,我可以发送,这里没有足够的空间来粘贴整个内容。 【参考方案1】:

您可以创建一个具有这些属性的类,然后通过反射获取对象的属性(因此我们可以使用循环),在 \n 字符上拆分字符串,然后为每个属性和每个设置,如果设置以属性名称开头,则根据设置字符串的其余部分设置属性值。

例如:

class User

    public string FirstName  get; set; 
    public string LastName  get; set; 
    public string Address  get; set; 
    public string BirthDate  get; set; 

    public override string ToString()
    
        return $"FirstName LastName, born on BirthDate, lives at: Address";
    


public class Program

    static void Main(string[] args)
    
        string str = "\nFIRSTNAMEJOHN\nLASTNAMESMITH\nADDRESS1590 GRACE STREET\nBIRTHDATE04201969";
        var user = new User();
        var properties = typeof(User).GetProperties();
        var settings = str.Split('\n');

        foreach (var property in properties)
        
            foreach (var setting in settings)
            
                if (setting.StartsWith(property.Name, StringComparison.OrdinalIgnoreCase))
                
                    property.SetValue(user, setting.Substring(property.Name.Length));
                    break;
                
            
        

        Console.WriteLine(user);

        GetKeyFromUser("\n\nDone! Press any key to exit...");
    

输出

【讨论】:

以上是关于如何解析没有分隔符的键值对的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

java 怎么样获取Map中第几个键值对

用于聚合键包含数字的键值对的算法

键值对的聚类

如何计算 JQ 中每个对象的键值对的出现次数?

如何在 Swift 中实现一个管理 UserDefaults 的键值对的通用结构?

java问题,我想在java中存储键值对,以便使用,但是键值对的键和值都有重复元素,使用hashmap会产生覆盖。