我想将列数据拆分为其他列

时间:2018-12-24 07:18:18

标签: c# sql sql-server

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

例如:-

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 

1 个答案:

答案 0 :(得分:1)

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

假设(由于OP中不够清晰)

  • 最小值是可选的
  • 如果存在,则“最小值”后接“ /”,然后是“最大值”
  • 说明是可选的

由于OP没有提到在“最小值”不可用时的假设,因此我将字符串类型用于“最小值/最大值”,但理想情况下应使用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=