如何为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个状态进行验证是否公平?
答案 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)
<强>假设:强>
没有合法牌照只包含两个字符。如果这样的虚荣板是可能的(我不在美国),你将不得不采取适当的措施。
<强>伪代码:强>
~
分隔符示例代码:
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 :