拆分板信息?

时间:2011-09-21 15:41:20

标签: c# string

如何为v / s状态的车牌打破此字符串?

我的数据库中每辆车都有唯一的VIN号码。

VIN varchar2(100)
Make varchar2(100)
Model varchar2(100)
Year varchar2(4)
PlateInfo varchar2(1000)

目标是在PlateInfo字段中取出字符串并将其拆分为状态和牌照。 有车辆拥有超过24个车主/板块的变化。

板信息中的字符串通常如下所示。

MA~CT~DE~NJ~NJ~~~~~~VEG-1825~AX7547~117824~NEG-1012~BEG-1011~~ 

这需要分为两列 StateId,PlateId

MA:VEG-1825
CT:AX7547
DE:117824
NJ:NEG-1012
NJ:BEG-1011

我能够做到这一点,假设波形符“〜”字符的出现次数始终为偶数。

然而,当我针对数据库运行此操作时,我发现有几辆车的信息看起来像这样。

CT~DC~DE~MA~MD~NY~RI~VA~WA~WV~ 

我的客户希望我把它放在一个带有空列的状态列中。我怎样才能做到这一点?使假设每个2个字符是一个状态,然后对50个状态进行验证是否公平?

3 个答案:

答案 0 :(得分:1)

如果不知道存储方式的规格,就很难(或不可能)提供准确的指导。

话虽如此,看起来就像你有10个状态条目,然后每条记录最多10个盘子。如果是这种情况,您应该只能使用string.Split,而不是删除空条目,并将前10个项目视为状态,并将剩余的任何条目视为匹配的板块。

答案 1 :(得分:1)

假设您的输入字符串是10个以上项目的列表,其中每个项目都以~终止,例如

"0~1~2~3~4~5~6~7~8~9~"
"0~1~2~3~4~5~6~7~8~9~10~11~12~13~14~15~16~17~18~19~"

您可以删除最后一个~并将字符串拆分为~

var parts = input.TrimEnd('~')
                 .Split('~');

状态似乎是前10个非空元素(参见 @Reed Copsey 的回答):

var states = parts.Take(10)
                  .Where(s => s != "");

这些板块似乎是第二个10个元素,如果需要,需要用空值填充:

var plates = parts.Skip(10)
                  .Take(10)
                  .Concat(Enumerable.Repeat<string>(null, 10));

然后按如下方式压缩状态和板块:

foreach (var item in states.Zip(plates, (state, plate) => new { state, plate }))
{
    Console.WriteLine("{0,-10} {1}", item.state, item.plate);
}

示例1:

MA         VEG-1825
CT         AX7547
DE         117824
NJ         NEG-1012
NJ         BEG-1011

示例2:

CT         <null>
DC         <null>
DE         <null>
MA         <null>
MD         <null>
NY         <null>
RI         <null>
VA         <null>
WA         <null>
WV         <null>

答案 2 :(得分:0)

<强>假设:

没有合法牌照只包含两个字符。如果这样的虚荣板是可能的(我不在美国),你将不得不采取适当的措施。

<强>伪代码:

  1. ~分隔符
  2. 处拆分字符串
  3. 从结果中删除空条目 - 您现在拥有许多状态或板号的标记
  4. 所有2长度字符串都是状态
  5. 所有其余的都是牌照
  6. 将它们合并
  7. 示例代码:

    public static void Main()
    {
        var inputs = new[]
        {
            "MA~CT~DE~NJ~NJ~~~~~~VEG-1825~AX7547~117824~NEG-1012~BEG-1011~~",
            "CT~DC~DE~MA~MD~NY~RI~VA~WA~WV~"
        };
    
    
        foreach(var input in inputs)
        {
            var plates = GetPlates(input);
            Console.Out.WriteLine("Input string: " + input);
            foreach(var plate in plates)
            {
                Console.Out.WriteLine(string.Format("{0} : {1}", plate.Key, plate.Value));
            }
        }
    
    }
    
    static KeyValuePair<string, string>[] GetPlates(string input)
    {
        var tokens = input.Split(new[] { '~' }, StringSplitOptions.RemoveEmptyEntries);
        var states = tokens.Where(t => t.Length == 2).ToArray();
        var plates = tokens.Where(t => t.Length != 2)
                           .Select(s => s.Replace("-", string.Empty));
    
        return states.Zip(plates.Concat(Enumerable.Repeat<string>(null, states.Length)),
              (state, plate) => new KeyValuePair<string, string>(state, plate)).ToArray();
    }
    

    <强>输出:

    Input string: MA~CT~DE~NJ~NJ~~~~~~VEG-1825~AX7547~117824~NEG-1012~BEG-1011~~
    MA : VEG1825
    CT : AX7547
    DE : 117824
    NJ : NEG1012
    NJ : BEG1011
    Input string: CT~DC~DE~MA~MD~NY~RI~VA~WA~WV~
    CT :
    DC :
    DE :
    MA :
    MD :
    NY :
    RI :
    VA :
    WA :
    WV :