добавление 2 строк из 2 операторов foreach в список - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь использовать 2 шаблона регулярных выражений для извлечения определенных c данных из этого pdf

public static void ReadPDF()
{
    using (PdfReader reader = new PdfReader(@"\\cytgit\Applications\C#\EZDock\CEVA.pdf"))
    {
        for (int i = 1; i <= reader.NumberOfPages; i++)
        {
            string text = PdfTextExtractor.GetTextFromPage(reader, i);
            string pattern2 = @"^\W*([\w-]+.*\n{1})Route Name:";
            Regex r2 = new Regex(pattern2, RegexOptions.Multiline);

            foreach (Match m in r2.Matches(text))
            {
                Debug.Print((m.Value.Substring(0, 13)));
            }

            string pattern = @"(?<=.*Initial Arrival.*(\n)).*?(?=(\r?\n)|$)";
            Regex r = new Regex(pattern, RegexOptions.Multiline);
            foreach (Match m in r.Matches(text))
            {

                List<string> stringList = m.Value.Split(' ').ToList();

                Routes.Add(new Routes { CarrierArrival = DateTime.Parse(stringList[0], System.Globalization.CultureInfo.InvariantCulture), CarrierDeparture = DateTime.Parse(stringList[1], System.Globalization.CultureInfo.InvariantCulture), PlantDestination = stringList[2], DockCode = stringList[3], InitialDest = stringList[4], InitialArrival = stringList[5], FinalLocation = stringList[6], Transit = stringList[7], PickupFreq = stringList[8], DeliveryFreq = stringList[9]});

            }
        }
    }
}

Таким образом, он печатает правильные данные на первом foreach, а второй foreach отлично работает также. Моя цель здесь - поместить то, что печатается в первом foreach, в тот же список, что и то, что добавлено во втором foreach stringList, таким образом я могу добавить m.Value.Substring(0, 13) в stringList, чтобы иметь возможность добавлять это на новый Route

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Создать список перед первым foreach?:

List<string> stringList = new List<string>();
foreach (Match m in r2.Matches(text))
{
    stringList.Add(m.Value.Substring(0, 13));
}

string pattern = @"(?<=.*Initial Arrival.*(\n)).*?(?=(\r?\n)|$)";
Regex r = new Regex(pattern, RegexOptions.Multiline);
foreach (Match m in r.Matches(text))
{
    stringList.AddRange(m.Value.Split(' '));
    Routes.Add(...);

}
0 голосов
/ 10 июля 2020

Я полагаю, на одной странице pdf есть несколько маршрутов (имя и детали). Проблема, которую я вижу, заключается в сопоставлении имен с соответствующей информацией.

Каждая страница Я бы попытался разделить эти разделы маршрута, чтобы получить список разделов. С дополнительным foreach l oop извлеките одно имя маршрута с помощью pattern2 и детали с помощью pattern

for (int i = 1; i <= reader.NumberOfPages; i++)
{
    string text = PdfTextExtractor.GetTextFromPage(reader, i);
    string routeSections[] = SplitPageInRouteSections(text);
    foreach(var routeSection in routeSections)
    {
        string routeName = Regex.Match(routeSection, pattern2).ToString()
        string[] details = Regex.Match(routeSection, pattern).ToString().Split(' ');
        Routes.Add(new Routes{ RouteName = routeName, CarrierArrival = details[0], ...})
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...