在vb.net中使用RegEx

如何解决在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

然后我使用上面的正则表达式(上面提到)来解析我不需要的内容。 但是它不起作用。

所以我的问题是(为了“澄清”)

  1. 这是执行我需要做的唯一或最佳方法吗? (将PDF转换为文本,删除我不需要的内容,然后将该信息输入到DataGridView中;或者还有另一个Cleaner更好的方法吗?

  2. (如果不是1)如何进行这项工作?我的RegEx或Logic有问题吗?我是否错过了更好/更清洁的东西,有人可以帮助我看看。

  3. (如果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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-