解析此文件的最佳方法是什么?
我只是想知道是否有人知道我可以在帖子底部解析文件的好方法。
我有一个数据库设置,其中每个部分都有正确的表,例如推荐表,呼叫者表,位置表。每个表格的列均与以下文件中显示的列相同
我真的很想找一些遗传的东西,所以如果文件布局发生变化,也不会给我带来太多麻烦。目前,我一次只读取一行文件,并且仅使用case语句来检查我所在的部分。
有人可以帮助我吗?
PS。我正在使用VB,但Cor可以执行其他任何操作,而且文档中的x只是我已屏蔽的个人信息
谢谢,
内森
文件:->
DIAL BEFORE YOU DIG Call 1100, Fax 1300 652 077 PO Box 7710 MELBOURNE, VIC 8004 Utilities are requested to respond within 2 working days and reference the Sequence number. [REFFERAL DETAILS] FROM= Dial Before You Dig - Web TO= Technical Services UTILITY ID= xxxxxx COMPANY= {Company Name} ENQUIRY DATE= 02/10/2008 13:53 COMMENCEMENT DATE= 06/10/2008 SEQUENCE NO= xxxxxxxxx PLANNING= No [CALLER DETAILS] CUSTOMER ID= 403552 CONTACT NAME= {Name of Contact} CONTACT HOURS= 0 COMPANY= Underground Utility Locating ADDRESS= {Address} SUBURB= {Suburb} STATE= {State} POSTCODE= 4350 TELEPHONE= xxxxxxxxxx MOBILE= xxxxxxxxxx FAX TYPE= Private FAX NUMBER= xxxxxxxxxx PUBLIC ADDRESS= xxxxxxxxxx PUBLIC TELEPHONE= EMAIL ADDRESS= {Email Address} [LOCATION DETAILS] ADDRESS= {Location Address} SUBURB= {Location Suburb} STATE= xxx POSTCODE= xxx DEPOSITED PLAN NO= 0 SECTION & HUNDRED NO= 0 PROPERTY PHONE NO= SIDE OF STREET= B INTERSECTION= xxxxxx DISTANCE= 0-200m B ACTIVITY CODE= 15 ACTIVITY DESCRIPTION= xxxxxxxxxxxxxxxxxx MAP TYPE= StateGrid MAP REF= Q851_63 MAP PAGE= MAP GRID 1= MAP GRID 2= MAP GRID 3= MAP GRID 4= MAP GRID 5= GPS X COORD= GPS Y COORD= PRIVATE/ROAD/BOTH= B TRAFFIC AFFECTED= No NOTIFICATION NO= 3082321 MESSAGE= entire intersection of Allora-Clifton rd , Hillside rd and merivale st MOCSMESSAGE= Digsafe generated referral Notice: Please DO NOT REPLY TO THIS EMAIL as it has been automatically generated and replies are not monitored. Should you wish to advise Dial Before You Dig of any issues with this enquiry, please Call 1100 (See attached file: 3082321_LLGDA94.GML)
解决方案
一旦我们知道文件格式称为" .ini",Google便会给出答案。
编辑:也就是说,它是一个.ini加上一些额外的前导/后缀。
我们可以顺序读取文件的每一行。每行本质上是一个名称/值对。将每个值放在以名称为键的映射(哈希表)中。为每个部分使用地图。解析完文件后,我们将拥有包含所有名称/值对的映射。遍历每个映射并填充数据库表。
我将前往Python进行这样的任何类型的字符串解析。我不确定要保留多少信息,但是我可能会使用Python的split()
函数在=
上进行拆分以消除等号,然后将空格从第二部分中去除的馅饼。
首先,我会屏蔽不需要的页眉/页脚信息,然后执行类似于以下操作:
让我们获取一个大块并将其保存在test1.txt
中:
ADDRESS= {Location Address} SUBURB= {Location Suburb} STATE= xxx POSTCODE= xxx DEPOSITED PLAN NO= 0 SECTION & HUNDRED NO= 0 PROPERTY PHONE NO=
这是一个小的python代码段:
>>> f = open("test1.txt", "r") >>> l = f.readlines() >>> l = [line.split('=') for line in l] >>> for line in l: print line ['ADDRESS', '{Location Address}'] ['SUBURB', '{Location Suburb}'] ['STATE', 'xxx'] ['POSTCODE', 'xxx'] ['DEPOSITED PLAN NO', '0'] ['SECTION & HUNDRED NO', '0'] ['PROPERTY PHONE NO', '']
这实际上将为我们提供一个[Column,Value]元组,可用于将数据插入数据库(转义所有字符串等后,SQL注入警告)。
这是假设电子邮件输入和数据库将具有相同的列名,但是如果没有,则使用字典来设置列映射将非常简单。另一方面,如果电子邮件和列是同步的,则无需知道列名即可进行解析。
我们可以遍历伪字典,并在参数化的sql字符串的正确位置打印出每个键值对。
希望这可以帮助!
编辑:虽然这是在Python中,但C#/ VB.net应该具有相同/相似的功能。
Using f As StreamReader = File.OpenText("sample.txt") Dim g As String = "undefined" Do Dim s As String = f.ReadLine If s Is Nothing Then Exit Do s = s.Replace(Chr(9), " ") If s.StartsWith("[") And s.EndsWith("]") Then g = s.Substring("[".Length, s.Length - "[]".Length) Else Dim ss() As String = s.Split(New Char() {"="c}, 2) If ss.Length = 2 Then Console.WriteLine("{0}.{1}={2}", g, Trim(ss(0)), Trim(ss(1))) End If End If Loop End Using