2008-10-02 10 views
2

Je me demandais juste si quelqu'un connaissait un bon moyen que je pourrais analyser le fichier au bas de la publication.Quel serait le meilleur moyen d'analyser ce fichier?

J'ai une configuration de base de données avec les tables correctes pour chaque section, par exemple Table Refferal, Caller Table, Location Table. Chaque table a les mêmes colonnes qui sont montrées dans le dossier ci-dessous

J'aimerais vraiment quelque chose qui est assez génétique ainsi si la disposition de dossier change elle ne me dérangera pas beaucoup. Pour l'instant, je lis le fichier en ligne à la fois et j'utilise simplement une déclaration de cas pour vérifier dans quelle section je me trouve.

Quelqu'un peut-il m'aider?

PS. J'utilise VB mais C# ou toute autre chose sera très bien, aussi les x dans le document ne sont que des informations personnelles que j'ai occulté

Merci, Nathan

fichier: --->

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) 

Répondre

5

Google has the answers, une fois que vous savez que le format de fichier est appelé « .ini »

Edit: C'est, il est un .ini ainsi que certains grands/gunk de fuite supplémentaire.

+0

Il ressemble à un .ini, à l'exception de la dernière ligne, qui semble être du texte non structuré. –

+0

Oh, et les quatre premières lignes. –

+0

Certes, il semble qu'il doit être rogné de gunk avant/arrière. –

4

Vous pouvez lire chaque ligne du fichier de manière séquentielle. Chaque ligne est essentiellement une paire de valeurs de nom. Placez chaque valeur dans une carte (table de hachage) avec un nom. Utilisez une carte pour chaque section. Une fois l'analyse du fichier terminée, vous aurez des cartes contenant toutes les paires de valeurs de nom. Itérer sur chaque carte et remplir vos tables de base de données.

2

Je voudrais diriger à Python pour n'importe quel type d'analyse de chaîne comme ceci. Je ne suis pas sûr de la quantité de cette information que vous souhaitez conserver, mais j'utiliserais peut-être la fonction split() de Python pour diviser = pour se débarrasser du signe égal, puis dépouiller les espaces de la deuxième partie du gâteau.

D'abord, je masquerait l'info en-tête/pied de page Je sais que je ne ai pas besoin, puis faire quelque chose de semblable à ce qui suit:

Jetons un morceau et l'enregistrer dans test1.txt:

 
ADDRESS=    {Location Address} 
SUBURB=    {Location Suburb} 
STATE=    xxx 
POSTCODE=    xxx 
DEPOSITED PLAN NO= 0 
SECTION & HUNDRED NO= 0 
PROPERTY PHONE NO= 

Voici un petit extrait de 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', ''] 

Cela essentiellement vous donner une [colonne, valeur] tuple vous pouvez utiliser pour insérer les données dans votre base de données (après esca ping toutes les chaînes, etc. etc, avertissement d'injection de SQL).

Cela suppose que l'entrée de courrier électronique et votre base de données auront les mêmes noms de colonnes, mais si ce n'est pas le cas, il serait assez trivial de configurer un mappage de colonne à l'aide d'un dictionnaire. D'un autre côté, si l'email et les colonnes sont en synchronisation, vous n'avez pas besoin de connaître les noms des colonnes pour obtenir l'analyse.

Vous pouvez parcourir le pseudo-dictionnaire et imprimer chaque paire clé-valeur au bon endroit dans votre chaîne sql paramétrée.

Espérons que cela aide!Edit: Bien que ce soit en Python, C#/VB.net devrait avoir les mêmes capacités/similaires.

+0

Il vous manque le fait que certaines «colonnes» se produisent plus d'une fois dans un «contexte» différent. Par exemple POSTCODE se produit à la fois dans les sections [CALLER DETAILS] et [LOCATION DETAILS]. – GerG

+0

C'est vrai, mais cela pourrait être résolu en créant des dictionnaires différents pour les différentes tables dans lesquelles insérer, ce qui, je pense, serait sage de toute façon. – pbh101

1
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 
Questions connexes