簡體   English   中英

在 vb.net 中使用 RegEx

[英]Using RegEx in vb.net

這是我需要做的(為清楚起見)取一個 PDF 文件(鏈接在底部)然后只將每個 header 下的信息解析到 DataFridView 中。 我想不出這樣做的方法(因為沒有處理 PDF 的本機方法)所以我唯一的想法是將它轉換為 txt 文檔,然后(以某種方式)從文本文檔中取出 txt 並將其放入數據網格視圖。

因此,我首先使用 Itextsharp 將 PDF 轉換為文本文件; 它保留了“大部分”的格式(見下面的鏈接)

這是那個的來源

 Dim mPDF As String = "C:\Users\Innovators World Wid\Documents\test.pdf"
    Dim mTXT As String = "C:\Users\Innovators World Wid\Documents\test.txt"
    Dim mPDFreader As New iTextSharp.text.pdf.PdfReader(mPDF)
    Dim mPageCount As Integer = mPDFreader.NumberOfPages()
    Dim parser As PdfReaderContentParser = New PdfReaderContentParser(mPDFreader)
    'Create the text file.
    Dim fs As FileStream = File.Create(mTXT)
    Dim strategy As iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy
    For i As Integer = 1 To mPageCount
        strategy = parser.ProcessContent(i, New iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy())
        Dim info As Byte() = New UTF8Encoding(True).GetBytes(strategy.GetResultantText())
        fs.Write(info, 0, info.Length)
    Next
    fs.Close()

但是我只需要信息的“行”。 所以一切都應該是這樣的

63 FMPC0847535411 OD119523523152105000 Aug 28, 2020 02:18 PM EXPRESS 64 FMPP0532201112 OD119523544975573000 Aug 28, 2020 02:18 PM EXPRESS 65 FMPP0532243104 OD119523557412412000 Aug 28, 2020 02:18 PM EXPRESS 66 FMPC0847516962 OD119523576945605000 Aug 28, 2020 02:18 PM EXPRESS 67 FMPC0847520947 OD119523760191783000 八月 28, 2020 02:19 PM 快遞

為了做到這一點,現在我需要使用 RegEx 刪除我不想要的所有內容,這里是我使用的 RegEx

The RegEx is 
(\d{2}\s.{14}\s.{20}\s.{3}\s\d{1,2},\s\d{4}\s\d{2}:\d{2}\s.{2}\sEXPRESS,*\s*R*e*p*l*a*c*e*m*e*n*t*\s*o*r*d*e*r*)";

這是我使用的代碼。

Private Sub Fixtext()

        Dim regex As Regex = New Regex("\d{2}\s.{14}\s.{20}\s.{3}\s\d{1,2},\s\d{4}\s\d{2}:\d{2}\s.{2}\sEXPRESS,*\s*R*e*p*l*a*c*e*m*e*n*t*\s*o*r*d*e*r*")
        Using reader As StreamReader = New StreamReader("C:\Users\Innovators World Wid\Documents\test.txt")
            While (True)
                Dim line As String = reader.ReadLine()
                If line = Nothing Then
                    Return
                End If
                Dim match As Match = regex.Match(line)
                If match.Success Then
                    Dim value As String = match.Groups(1).Value
                    Console.WriteLine(line)
                End If
            End While
        End Using
End Sub

結果是“接近”但不完全是我需要的方式。 在某些情況下,它們被“擠”在一起,但仍有部分遺留下來。 一個例子是

90 FMPC0847531898 OD119522758218348000 Aug 28, 2020 03:20 PM EXPRESS
491 FMPP0532220915 OD119522825195489000 Aug 28, 2020 03:21 PM EXPRESS
Tracking Id Forms Required Order Id RTS done on Notes492 FMPP0532194482 OD119522868525176000 Aug 28, 2020 03:21 PM EXPRESS 
493 FMPP0532195684 OD119522871090000000 Aug 28, 2020 03:21 PM EXPRESS494 FMPP0532224318 OD119522895172342000 Aug 28, 2020 03:21 PM EXPRESS

我實際需要的格式(再次)是一種我可以用來稍后將數據導入數據網格視圖的格式,因此對於每一行都需要

[number][ID][ID2][Date][Notes] 
[number][ID][ID2][Date][Notes]
[number][ID][ID2][Date][Notes] 
[number][ID][ID2][Date][Notes] 

使用這個“概念”這是我需要的一個例子(雖然我知道這行不通,但這些方面的東西會起作用)

  Dim regex As Regex = New Regex("\d{2}\s.{14}\s.{20}\s.{3}\s\d{1,2},\s\d{4}\s\d{2}:\d{2}\s.{2}\sEXPRESS,*\s*R*e*p*l*a*c*e*m*e*n*t*\s*o*r*d*e*r*")
            Using reader As StreamReader = New StreamReader("C:\Users\Innovators World Wid\Documents\test.txt")
                While (True)
                    Dim line As String = reader.ReadLine()
                    If line = Nothing Then
                        Return
                    End If
                    Dim match As Match = regex.Match(line)
                    If match.Success Then
                        Dim value As String = match.Groups(1).Value
                        Dim s As String = value
                        s = s.Replace(" Tracking Id Forms Required Order Id RTS done on Notes", Nothing)
                        s = s.Replace("EXPRESS ", "EXPRESS")
                        s = s.Replace("EXPRESS", "EXPRESS" & vbCrLf)
                        Console.WriteLine(line)
                    End If
                End While
            End Using

這是包含文件的“簡要”說明。

原始 PDF 的副本(這是使用 itext 將 PDF 轉換為.txt)我這樣做只是因為我想不出辦法(除了支付第三方工具將 pdf 轉換為 XLS 之外)

https://drive.google.com/file/d/1iHMM_G4UBUlKaa44-Wb00F_9ZdG-vYpM/view?usp=sharing

使用上面的“itext 方法”我提到這是輸出的轉換文件

https://drive.google.com/file/d/10dgJDFW5XlhsB0_0QAWQvtimsDoMllx-/view?usp=sharing

然后我使用上面的正則表達式(上面提到的)來解析我不需要的東西。 但是它不起作用。

所以我的問題是(為了“清晰”)

  1. 這是做我需要做的唯一或最好的方法嗎? (將 PDF 轉換為文本,刪除我不需要的內容,然后將該信息輸入到 DataGridView 中;或者是否有另一種更清潔、更好的方法?

  2. (如果不是 1)我怎樣才能完成這項工作? 我的正則表達式或我的邏輯有問題嗎? 我是否缺少有人可以幫助我查看的更好/更清潔的東西。

  3. (如果 2 ^ 不是 1)獲取結果並將它們放在適當的 DataGridView 列中的最佳方法是什么。

最后聲明:不一定是這種方法。 我將采用“任何”方法,允許我做我需要做的事情,越干凈越好,但是我必須這樣做,避免使用有限制的免費第 3 方庫; 付費第三方圖書館。 這給我留下了局限性。 IE:PDFBox,itext,itextsharp)這必須能夠引導我從 PDF(如上面的示例)到 Datagridview 甚至列表視圖中的表信息。

我會接受任何幫助,我會更加感激。 我也確實重新問了這個問題,因為一個 mod 關閉了我原來的問題“說不清楚我需要什么”我確實在這兩種情況下都嘗試讓問題盡可能“徹底”,但我希望這是“更清楚的” " 所以它不會突然關閉。

試試這個正則表達式,看看它是否符合您的要求:

\b[0-9].*(FMPC|OD).*(EXPRESS|Replacement\sOrder)\b

我通過更正文本文件作弊了一點。 它在分頁符和錯過開始新行時有點不穩定。 也許您可以使用 Itextsharp 或難以維護的正則表達式來糾正它。

我做了一個 class 來保存數據。 屬性名稱成為DataGridView中的列標題。

我將文本文件中的所有行讀入一個數組。 我檢查了該行的第一個字符,看它是否是一個數字,然后根據空格將該行拆分為另一個數組。 接下來,我創建了一個新的Tracking object,並使用參數化構造函數充實了它的所有屬性。

最后,我檢查了該行是否包含一個逗號並將該文本添加到 notes 參數中。 完成的object被添加到列表中。

循環后lst被綁定到網格。

Public Class Tracking
    Public Property Number As Integer
    Public Property ID As String
    Public Property ID2 As String
    Public Property TrackDate As Date
    Public Property Notes As String
    Public Sub New(TNumber As Integer, TID As String, TID2 As String, TDate As DateTime, TNotes As String)
        Number = TNumber
        ID = TID
        ID2 = TID2
        TrackDate = TDate
        Notes = TNotes
    End Sub
End Class

Private Sub OPCode()
    Dim lst As New List(Of Tracking)
    Dim lines = File.ReadAllLines("C:\Users\maryo\Desktop\test.txt")
    For Each line In lines
        If Char.IsDigit(line(0)) Then
            Dim parts = line.Split(" "c)
            Dim T As New Tracking(CInt(parts(0)), parts(1), parts(2), Date.ParseExact($"{parts(3)} {parts(4)} {parts(5)} {parts(6)} {parts(7)}", "MMM d, yyyy hh:mm tt", CultureInfo.CurrentCulture), parts(8))
            If line.Contains(",") Then
                T.Notes &= line.Substring(line.IndexOf(","))
            End If
            lst.Add(T)
        End If
    Next
    DataGridView1.DataSource = lst
End Sub

編輯
為了查明錯誤,讓我們嘗試...

Private Sub OPCode()
    Dim lst As New List(Of Tracking)
    Dim lines = File.ReadAllLines("C:\Users\maryo\Desktop\test.txt")
    For Each line In lines
        If Char.IsDigit(line(0)) Then
            Dim parts = line.Split(" "c)
            If parts.Length < 9 Then
                Debug.Print(line)
                MessageBox.Show($"We have a line that does not include all fields.")
                Exit Sub
            End If
            Dim T As New Tracking(CInt(parts(0)), parts(1), parts(2), Date.ParseExact($"{parts(3)} {parts(4)} {parts(5)} {parts(6)} {parts(7)}", "MMM d, yyyy hh:mm tt", CultureInfo.CurrentCulture), parts(8))
            If line.Contains(",") Then
                T.Notes &= line.Substring(line.IndexOf(","))
            End If
            lst.Add(T)
        End If
    Next
    DataGridView1.DataSource = lst
End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM