Knowledged Ответов: 2

Как я могу заполнить datagrid анализируемыми данными PDF


Так что на данный момент у меня есть PDF-файл, который я разбираю. Я разделил его там, где мне нужно

CYT-HMI-S-005 CarrierSCAC: BPUS Stop Number:1 Release Type: AUTO
Route Name:
Days to 
Pick-up Delivery 
Final 
Order Due @ 
Frequency: Frequency:
Location
Carrier Arrival Carrier Departure Plant Destination Dock Code Initial Dest Final Location
Initial Arrival
10:45 11:15 HMI IHMI1 HMI 14:45 14:45 0 MTWRFS MTWRFS // This is the only line I need to parse and add to the datagrid.


Данные в этой строке
10:15 11:00 HMI IOSL1 OSL 17:15 17:15 0 MTWRFS MTWRFS
это просто данные, которые включают в себя время прибытия, Время отправления, компанию, корабль-к месту и так далее. Проблема не в данных. Проблема заключается в импорте этой строки в сетку данных под определенными столбцами.

Поэтому после каждого "первоначального прибытия" я хотел бы разобрать эту текстовую строку
10:15 11:00 HMI IOSL1 OSL 17:15 17:15 0 MTWRFS MTWRFS
и вставьте его в датагрид.

Или План Б:
Я запускаю запрос из базы данных, который возвращает отгрузки и может сопоставить результаты с проанализированными pdf-данными через столбец

TLDR: есть важные данные, хранящиеся в 2 разных местах. Данные в формате PDF отправляются ежемесячно из компании. Мне нужно иметь возможность сопоставлять столбцы из базы данных и проанализированные данные pdf.

Что я уже пробовал:

public static void ReadPDF()
        {
            PdfReader reader = new PdfReader(@"file.pdf");
            int intPageNum = reader.NumberOfPages;
            string text;
            string[] words;
            string line;

            for (int i = 1; i <= intPageNum; i++)
            {
                text = PdfTextExtractor.GetTextFromPage(reader, i, new LocationTextExtractionStrategy());

                words = text.Split($"Delivery Frequency:");
                for (int j = 0, len = words.Length; j < len; j++)
                {
                    line = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(words[j]));
                    Debug.Print(line);
                }
            }


Это код, который я использую для анализа PDF-данных.

2 Ответов

Рейтинг:
1

Richard MacCutchan

Вам просто нужно собрать соответствующие столбцы в список<t> или аналогичную коллекцию, которую вы используете в качестве источника сетки. Первое, что нужно решить, - это какие поля вы хотите отобразить и в каком порядке.


Knowledged

Я бы просто хотел вставить as is в datagrid на данный момент. Шаг за шагом.

Richard MacCutchan

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

Knowledged

Я хотел бы отделить столбцы пробелами между ними. Не могли бы вы помочь мне с примером?

Richard MacCutchan

Воспользуйся Строка.Метод Разделения (Система) | Microsoft Docs[^] чтобы разделить различные поля, затем добавьте их в отдельные ячейки строки datagrid и добавьте строку в сетку.

Knowledged

Да, я понимаю, что не могли бы вы помочь мне с добавлением разделения строк в строку сетки? допустим, колонка[2]

Richard MacCutchan

Вы не можете разделить его на 10 полей, а затем разместить в одной ячейке. Но, возможно, я что-то упускаю здесь о том, как именно вы хотите отобразить эту информацию.

Knowledged

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
-------------------------------------------------------------------------
|10:15 | 11:00 | HMI | IOSL1 | OSL| 17:15 | 17:15 | 0 | MTWRFS | MTWRFS|


это не совсем то, что я хотел, но я надеюсь, что вы поняли эту идею.


Надеюсь, это поможет?

Richard MacCutchan

Нет, извините, я не понимаю этой идеи. Если вам нужны эти данные в одном столбце, то вам не нужно разбивать их на отдельные поля. Если вы хотите разделить его, то вам нужно 10 столбцов.

Knowledged

Да так бы и было 10 колонок. каждый раздел в своей колонке.

Richard MacCutchan

Так в чем же именно заключается ваша проблема?

Knowledged

Мне нужно знать, как добавить эти данные

10:15  11:00 HMI  IOSL1  OSL  17:15  17:15  0  MTWRFS  MTWRFS
в строке datagrid по 10 столбцов. Столбцы текста: пространства, ограниченного с точки зрения Майкрософт Excel.

Richard MacCutchan

Смотрите мой предложенный код ниже.

Рейтинг:
0

Richard MacCutchan

Это добавит десять полей в следующую строку DataGridView.

// split the fields of the text line
string[] fields = pdfLine.Split(new char[] { ' ' });

// add a new row
int rowNum = dataGridView1.Rows.Add();
DataGridViewRow row = dataGridView1.Rows[rowNum];

// add the fields to the separate columns of the new row
for (int i = 0; i < fields.Length; ++i)
{
    row.Cells[i].Value = fields[i];
}


Knowledged

Я обновил вопрос, чтобы показать, как выглядят данные, которые мне нужно разобрать.

Richard MacCutchan

Да, и именно эти данные я использовал в своем примере.

Knowledged

Итак, я выполняю readpdf из модели представления, а datagrid находится в другом представлении. Поэтому я не могу использовать строки add

Richard MacCutchan

Извините, что я не использовал MVVM, так что это ничего для меня не значит.

Knowledged

CYT-ELP-S-007
CarrierSCAC:
VEXP-N
Stop
Number:1
Release
Type:
AUTO
Route
Name:
Days
to

Pick-up
Delivery

Final

Order
Due
@

Frequency:
Frequency:
Location
Carrier
Arrival
Carrier
Departure
Plant
Destination
Dock
Code
Initial
Dest
Final
Location
Initial
Arrival
13:30
14:00
ELP
ELP1
ELP
15:15
15:15
0
MTWRFS
MTWRFS


Итак, с помощью предоставленного вами кода это то, что печатается в debug.

Richard MacCutchan

Почему вы разделяете все строки, а не только ту, которая содержит интересующие вас данные?

Knowledged

Потому что мне нужна помощь в точном определении этой строки, чтобы добавить ее в datagrid.

Richard MacCutchan

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

Knowledged

Тогда как же мне получить эту следующую строку после "первоначального прибытия" и только эту строку

Richard MacCutchan

Просто продолжай читать.