Нахождение нескольких полу предсказуемых шаблонов в строке - PullRequest
0 голосов
/ 09 апреля 2019

Хорошо, поэтому я пишу приложение, которое должно иметь возможность извлечь номер НДС из счета (https://en.wikipedia.org/wiki/VAT_identification_number)

Самая большая проблема, которую необходимо преодолеть, заключается в том, что, как видно из статьи в Википедии, на которую я ссылаюсь, каждая страна использует свой собственный формат для этих номеров НДС (Нидерланды используют номер из 14 символов, а Германия использует номер из 11 символов).

Чтобы извлечь эти числа, я выбрасываю каждую строку из счета в массив строк, и для каждой строки я проверяю, имеет ли она длину, равную одному из форматов НДС, и если это проверяется, Я проверяю, содержит ли указанная строка также код страны («NL», «DE» и т. Д.).

 string[] ProcessedFile = Reader.ProcessFile(Input);
            foreach(string S in ProcessedFile)
            {
                RtBEditor.AppendText(S + "\n");
            }

            foreach(string X in ProcessedFile)
            {
                string S = X.Replace(" ", string.Empty);
                if (S.Length == 7)
                {
                    if (S.Contains("GBGD"))
                    {
                        MessageBox.Show("Land = Groot Britanie (Regering)");
                    }
            }
            /*
repeat for all other lenghts and country codes.
*/

Проблема с этим кодом в том, что 1-й: если есть строка, длина которой совпадает с длиной одного из форматов НДС, и в нее встроен код страны, код будет ошибочно думать, что он нашел номер НДС. второй: В некоторых случаях номер НДС будет включен как «номер НДС: [номер НДС]». В этом случае текст, предшествующий фактическому номеру, будет добавлен к его длине, что сделает программу неспособной определить фактический номер НДС.

Лучший способ исправить это - это мое предположение как-то изолировать номер НДС от всех строк вместе, но мне еще предстоит найти способ, как на самом деле это сделать.

Кто-нибудь случайно знает какое-нибудь потенциальное решение?

Большое спасибо заранее!


EDIT: Добавлен фиктивный счет, чтобы уточнить, какие данные содержатся в счетах. enter image description here

1 Ответ

0 голосов
/ 10 апреля 2019

Как указывалось в комментариях, лучший способ исправить это - использовать Regex.Немного поэкспериментировав, я пришел к следующему решению:

        public Regex FilterNormaal = new Regex(@"[A-Z]{2}(\d)+B?\d*");
        private void BtnUitlezen_Click(object sender, EventArgs e)
        {
            RtBEditor.Clear();
            /*
             Temp dummy vatcodes for initial testing.
             */
            Form1.Dummy1.VAT = "NL855291886B01";
            Form1.Dummy2.VAT = "DE483270846";
            Form1.Dummy3.VAT = "SE482167803501";
            OCR Reader = new OCR();
            /*
             Grab and process image
             */
            if(openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    Input = new Bitmap(openFileDialog1.FileName);
                }
                catch
                {
                    MessageBox.Show("Please open an image file.");
                }
            }
            string[] ProcessedFile = Reader.ProcessFile(Input);
            foreach(string S in ProcessedFile)
            {
                string X = S.Replace(" ", string.Empty);
                RtBEditor.AppendText(X + "\n");
            }


            foreach (Match M in FilterNormaal.Matches(RtBEditor.Text))
            {
                MessageBox.Show(M.Value);
            }    
}

Сначала я попытался перебрать массив строк, чтобы найти совпадение, но по неизвестным причинам это не дало никаких результатов.Применяя регулярное выражение ко всему текстовому полю, он выводил нужные мне результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...