Раскол пластины Информация? - PullRequest
       0

Раскол пластины Информация?

0 голосов
/ 21 сентября 2011

Как мне разбить эту строку для номеров номерных знаков 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 ]

1 голос
/ 21 сентября 2011

Не зная специфика того, как вещи хранятся, трудно (или невозможно) дать точное руководство.

При этом, выглядит как будто у вас есть 10 записей о состоянии, затем до 10 пластин на запись. Если это так, вы можете просто использовать string.Split, не удалять пустые записи и обрабатывать первые 10 элементов как состояния, а все остальные как соответствующие пластины.

1 голос
/ 21 сентября 2011

Предполагая, что ваша входная строка представляет собой список из 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>
0 голосов
/ 21 сентября 2011

Допущение:

Нет юридических номеров, состоящих только из двух символов.Если такие туалетные столики возможны (я не в США), вам придется принять соответствующие меры.

Псевдокод:

  1. Разделитьстрока в ~ разделитель
  2. Удалите пустые записи из результатов - теперь у вас есть много токенов, которые являются состояниями или номерами табличек
  3. Все строки длиной 2 являются состояниями
  4. Все остальные являются пластинами
  5. Объедините их

Пример кода:

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 :
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...