首页 > 解决方案 > 我想将列数据拆分为不同的列

问题描述

我在一列中有数据,我想将其拆分为不同的列。列中的数据不一致。

例如:-

974/mt (ICD TKD)                                  
974/mt (+AD 91.27/mt, ICD/TKD)                    
970-980/mt                                        
970-980/mt 

我尝试过使用子字符串,但没有找到任何解决方案

输出应该是:-

min  |max  | unit | description
-------------------------
NULL | 974 |  /mt | ICD TKD

NULL | 974  | /mt |+AD 91.27/mt, ICD/TKD

970  | 980  | /mt |NULL 

标签: c#sqlsql-server

解决方案


您可以使用 Regex 解析信息,然后使用解析的数据添加列。

假设(由于 OP 中缺乏明确性)

  • 最小值是可选的
  • 如果存在,Min Value 后跟一个“/”,然后是 Max Value
  • 描述是可选的

由于 OP 没有提到当 Min Value 不可用时要假设什么,所以我使用字符串类型作为 Min/Max 值,但理想情况下应该用 apt DataType 替换。

public Sample Split(string columnValue)
{
    var regex = new Regex(@"(?<min>\d+-)?(?<max>\d+)(?<unit>[\/a-zA-Z]+)\s?(\((?<description>(.+))\))?",RegexOptions.Compiled);
    var match = regex.Match(columnValue);
    if(match.Success)
    {
        return new Sample
        {
            Min = match.Groups["min"].Value,
            Max = match.Groups["max"].Value,
            Unit = match.Groups["unit"].Value,
            Description = match.Groups["description"].Value
        };
    }
    return default;
}

public class Sample
{
    public string Min{get;set;}
    public string Max{get;set;}
    public string Unit{get;set;}
    public string Description{get;set;}
}

例如,

var list = new []
    {
    @"974/mt (ICD TKD)",
    @"974/mt (+AD 91.27/mt, ICD/TKD)",
    @"970-980/mt",
    "970-980/mt"
    };

   foreach(var item in list)
   {
     var result = Split(item);
     Console.WriteLine($"Min={result.Min},Max={result.Max},Unit={result.Unit},Description={result.Description}");
   }

输出

Min=,Max=974,Unit=/mt,Description=ICD TKD
Min=,Max=974,Unit=/mt,Description=+AD 91.27/mt, ICD/TKD
Min=970-,Max=980,Unit=/mt,Description=
Min=970-,Max=980,Unit=/mt,Description=

推荐阅读