C# 拼版信息?
如何断开牌照v/s状态的字符串 我的数据库中有每辆车的唯一VIN编号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
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 :
~
分隔符处拆分字符串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~字符的东西都将回到企业。