我想从上述PDF文档中提取公司信息。由于公司的限制,我只能使用Uipath的ReadPDF活动来提取PDF中的文本。我已经去掉了头部和尾部,并将所有公司条目都放入了主体中。公司条目的结构如下,
BR号码 英文名称 中文名称
BRNumber可以是字母和数字的组合,长度为8。 英文名称可以是字母和特殊字符的组合。 中文名称可以是汉字和特殊字符的组合。
当英文名或中文名太长时,会被分成两行。
BR编号、英文名称、中文名称之间以空格分隔。英文名称中的单词也用空格分隔。
如何提取BRNumber、EnglishName和ChineseName?
我尝试用正则表达式分隔一行
([A-Za-z0-9\-]*)\s*(([A-Za-z0-9-'&.,\s()/]*)\s*([A-Za-z0-9-'&.,\s()/]*)\s*([A-Za-z0-9-'&.,\s()/]*))\s*([\d\u4e00-\u9fff-\s()()]*)
但是当ChineseName不是以汉字开头时,结果是错误的。
例如,
C1234567 | 20 你好有限公司 | 20 你好有限公司
将成为
C1234567 | 20 你好有限公司 20 |你好有限公司
该栏只是为了显示得更清楚。请忽略它。
不用正则表达式,只需使用普通的旧字符串操作...
从前面搜索第一个空格即可得到BRNumber。 从后面搜索最后一个空格即可得到中文名称。 中间的所有内容都必须是英文名称。 添加对多行字符串的额外检查以处理边缘情况。
类似:
Public Class DataValues
Public BRNumber As String
Public EnglishName As String
Public ChineseName As String
Public Shared Function GetDataValues(ByVal data As String) As DataValues
Dim dv As New DataValues
Dim firstSpace As Integer = data.IndexOf(" ")
Dim lastSpace As Integer = data.LastIndexOf(" ")
Dim newLine As Integer = data.IndexOf(Environment.NewLine)
If newLine <> -1 AndAlso firstSpace <> -1 AndAlso firstSpace < newLine Then
dv.BRNumber = data.Substring(0, firstSpace)
dv.EnglishName = data.Substring(firstSpace + 1, newLine - firstSpace - 1)
dv.ChineseName = data.Substring(newLine + Environment.NewLine.Length)
ElseIf firstSpace <> -1 AndAlso lastSpace <> -1 AndAlso firstSpace <> lastSpace Then
dv.BRNumber = data.Substring(0, firstSpace)
dv.EnglishName = data.Substring(firstSpace + 1, lastSpace - firstSpace - 1)
dv.ChineseName = data.Substring(lastSpace + 1)
End If
Return dv
End Function
Public Overrides Function ToString() As String
Return "BRNumber: " & BRNumber & Environment.NewLine &
"EnglishName: " & EnglishName & Environment.NewLine &
"ChineseName: " & ChineseName & Environment.NewLine
End Function
End Class
这是在按钮单击事件中使用的类:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim data As String = "C1234567 20 Hello Co.Ltd 20 你好有限公司"
Dim data2 As String = "C1234567 20 Hello Co.Ltd 20" & Environment.NewLine & "你好有限公司"
Dim dv1 As DataValues = DataValues.GetDataValues(data)
Debug.Print(dv1.ToString())
Dim dv2 As DataValues = DataValues.GetDataValues(data2)
Debug.Print(dv2.ToString())
End Sub
这是 IDE 的输出:
BRNumber: C1234567
EnglishName: 20 Hello Co.Ltd 20
ChineseName: 你好有限公司
BRNumber: C1234567
EnglishName: 20 Hello Co.Ltd 20
ChineseName: 你好有限公司