如何解决在vb.net中使用RegEx
这是我需要做的(为清楚起见) 取得PDF档案(底部的连结) 然后,仅将每个标题下的信息解析为DataFridView。 我想不出一种方法(因为没有本地方法可以处理PDF) 因此,我唯一的想法是将其转换为txt文档,然后(以某种方式)从文本文档中获取txt并将其放入datagridview。
因此,我首先使用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,info.Length)
Next
fs.Close()
但是我只需要信息的“行”。所以一切应该看起来像这样
63 FMPC0847535411 OD11952352315210105000 2020年8月28日,下午EXPRESS 64 FMPP0532201112 OD119523544975573000 2020年8月28日,下午EXPRESS 65 FMPP0532243104 OD119523557412412000 2020年8月28日,下午EXPRESS 66 FMPC0847516962 OD119523576945605000 2020年8月28日,下午EXPRESS 67 FMPC0847520947 OD119523760191783000 2020年8月28日,下午
为了做到这一点,我现在需要使用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,*\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
我实际上需要的格式是(再次)我可以用来稍后将数据导入到datagridview中的格式 所以每一行都需要
[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,*\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转换为.txt的PDF) 我之所以这样做,是因为我想不出办法(除了购买第三方工具以将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
然后我使用上面的正则表达式(上面提到)来解析我不需要的内容。 但是它不起作用。
所以我的问题是(为了“澄清”)
-
这是执行我需要做的唯一或最佳方法吗? (将PDF转换为文本,删除我不需要的内容,然后将该信息输入到DataGridView中;或者还有另一个Cleaner更好的方法吗?
-
(如果不是1)如何进行这项工作?我的RegEx或Logic有问题吗?我是否错过了更好/更清洁的东西,有人可以帮助我看看。
-
(如果2 ^不是1)获取结果并将其放置在适当的DataGridView列中的最佳方法是什么。
最后声明:不必是这种方法。我将采用“ ANY”方法,该方法将使我能够做我需要做的事情,越干净越好,但是我必须这样做,以避免第三方库不受限制。付费的第三方图书馆。那使我有局限性。 IE:PDFBox,itext,itextsharp)而且这必须能够将我从PDF(如上述示例)引导至Datagridview甚至listview中的表格信息。
我会尽一切帮助,我会更加感激。我也重新询问了这个问题,因为一个mod结束了我原来的问题“说不清楚我需要什么”,我在两种情况下都尽力使这个问题尽可能“彻底”,但是我希望这是“更清晰” ”,因此它不会突然关闭。
解决方法
尝试使用此正则表达式,看看它是否符合您的要求:
\b[0-9].*(FMPC|OD).*(EXPRESS|Replacement\sOrder)\b
,
我通过更正文本文件有点作弊。它在分页符时有点不可靠,错过了开始新行的时间。也许您可以使用Itextsharp或难以维护的正则表达式来纠正它。
我做了一个类来保存数据。属性名称成为DataGridView
中的列标题。
我将文本文件中的所有行读入数组。我检查了行的第一个字符,看它是否是一个数字,然后根据空格将行拆分为另一个数组。接下来,我创建了一个新的Tracking
对象,并使用参数化构造函数将其所有属性充实了。
最后,我检查了该行是否包含逗号,并将该段文本添加到notes参数。完成的对象将添加到列表中。
循环之后,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)),"))
End If
lst.Add(T)
End If
Next
DataGridView1.DataSource = lst
End Sub
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。