Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 拼版信息?_C#_String - Fatal编程技术网

C# 拼版信息?

C# 拼版信息?,c#,string,C#,String,如何断开牌照v/s状态的字符串 我的数据库中有每辆车的唯一VIN编号 VIN varchar2(100) Make varchar2(100) Model varchar2(100) Year varchar2(4) PlateInfo varchar2(1000) 目标是在PlateInfo字段中获取字符串,并将其拆分为州和车牌。 有些车辆的车主/车牌更换次数超过24次 plate info中的字符串通常如下所示 MA~CT~DE~NJ~NJ~~~~~~VEG-1825~AX7547~117

如何断开牌照v/s状态的字符串

我的数据库中有每辆车的唯一VIN编号

VIN varchar2(100)
Make varchar2(100)
Model varchar2(100)
Year varchar2(4)
PlateInfo varchar2(1000)
目标是在PlateInfo字段中获取字符串,并将其拆分为州和车牌。 有些车辆的车主/车牌更换次数超过24次

plate info中的字符串通常如下所示

MA~CT~DE~NJ~NJ~~~~~~VEG-1825~AX7547~117824~NEG-1012~BEG-1011~~ 
CT~DC~DE~MA~MD~NY~RI~VA~WA~WV~ 
这需要分成两列StateId和PlateId

MA:VEG-1825
CT:AX7547
DE:117824
NJ:NEG-1012
NJ:BEG-1011
我之所以能够这样做,是因为我假设波浪形“~”字符的出现次数始终是偶数

然而,当我在数据库中运行时,我发现有几辆车的信息看起来像这样

MA~CT~DE~NJ~NJ~~~~~~VEG-1825~AX7547~117824~NEG-1012~BEG-1011~~ 
CT~DC~DE~MA~MD~NY~RI~VA~WA~WV~ 

我的客户想让我把它放在一个state列中,并为车牌设置一个null列。我怎样才能做到这一点?假设每个2个字符都是一个状态,然后对照50个状态验证是否公平

假设:

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 :
没有仅由两个字符组成的合法车牌。如果像这样的梳妆板是一种可能性(我不在美国),你将不得不采取适当的措施

伪代码:

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 :
  • ~
    分隔符处拆分字符串
  • 从结果中删除空条目——您现在有很多标记,它们要么是州号,要么是车牌号
  • 所有长度为2的字符串都是状态
  • 其余的都是盘子
  • 把它们结合起来
  • 示例代码:

    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 :
    

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


    这就是说,看起来你有10个州条目,然后每个记录最多有10个板块。如果是这种情况,您应该能够只使用string.Split,而不是删除空条目,并将前10项视为状态,其余的项视为匹配的图版。

    假设您的输入字符串是一个包含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的答案):

    这些板似乎是第二个10个元素,如有必要,需要用空字符填充:

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

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

    CT
    直流
    判定元件
    文科硕士
    医学博士
    纽约
    RI
    弗吉尼亚州
    华盛顿州
    WV
    
    看起来您有两组分隔符:
    ~~~~~
    表示状态与板材细节之间的分隔,
    ~
    表示每个状态与每个板材细节之间的分隔。听起来你只需要拆分成多个组件,然后拆分每个组件并匹配它们。这也是一个教科书式的例子,说明了为什么这样的数据不应该转储到一列中,特别是当这应该是一个单独的表时。这种假设是有风险的。如果有人有一个与州名缩写相同的梳妆台怎么办?@Tejs计划将其移动到另一张桌子上。我不确定空~标记是否是分隔符。如果您还包括一个包含10个以上状态信息的值的示例,这会有所帮助。还有一个例子,车牌换了,但州政府没有看到他们没有为这种情况做傻事。10计数并不适用于所有有问题的车辆。其中一些已经有超过15个所有者变更。有些人只有7个。所以我不确定空~是从哪里来的。@abhi:我刚才在看你的例子-两个都有10个状态条目的“空格”(这可以解释空~的原因)。正如我所说,在前面,你真的需要知道规格,知道如何正确地做到这一点-否则,你将猜测,并使一些潜在的错误…这是我们决定采用的方法。任何没有10+10~字符的东西都将回到企业。