2

投稿の下部にあるファイルを解析できる良い方法を誰かが知っているかどうか疑問に思っていました.

各セクションに適切なテーブルを使用してデータベースをセットアップしました。たとえば、Refferal テーブル、Caller テーブル、Location テーブルなどです。各テーブルには、以下のファイルに示されているものと同じ列があります

かなり遺伝的なものが本当に欲しいので、ファイルレイアウトが変わってもあまり混乱しません。現時点では、ファイルを一度に 1 行ずつ読み取り、case ステートメントを使用して現在のセクションを確認しています。

誰でもこれで私を助けることができますか?

PS。私は VB を使用していますが、C# などでも問題ありません。また、ドキュメント内の 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)
4

4 に答える 4

5

ファイル形式が「.ini」と呼ばれることがわかれば、Googleに答えがあります

編集:つまり、.ini に追加の先頭/末尾のガンクを加えたものです。

于 2008-10-02T06:29:02.740 に答える
4

ファイルの各行を順番に読み取ることができます。各行は、基本的に名前と値のペアです。名前でキー付けされたマップ (ハッシュ テーブル) に各値を配置します。各セクションのマップを使用します。ファイルの解析が完了すると、すべての名前と値のペアを含むマップが作成されます。各マップを繰り返し処理し、データベース テーブルに入力します。

于 2008-10-02T06:31:34.387 に答える
2

私はこのようなあらゆるタイプの文字列解析のためにPythonに向かいます。この情報をどれだけ保持したいかはわかりませんが、Pythonのsplit()関数を使用=して等号を削除し、パイの2番目の部分から空白を削除します。

まず、不要だとわかっているヘッダー/フッター情報をマスクしてから、次のようなことを行います。

チャンクを取り、それを保存しましょうtest1.txt

ADDRESS={ロケーションアドレス}
SUBURB={ロケーション郊外}
STATE = xxx
POSTCODE = xxx
堆積計画NO=0
SECTION&HUNDRED NO = 0
プロパティ電話番号=

これが小さなPythonスニペットです:

>>> f = open( "test1.txt"、 "r")
>>> l = f.readlines()
>>> l = [line.split('=')for line in l]
>>> lの行の場合:
    印刷行

['ADDRESS'、'{Location Address}']
['SUBURB'、'{Location Suburb}']
['STATE'、'xxx']
['POSTCODE'、'xxx']
['DEPOSITED PLAN NO'、 '0']
['SECTION&HUNDRED NO'、 '0']
['PROPERTY PHONE NO'、'']

これにより、基本的に、データベースにデータを挿入するために使用できる[列、値]タプルが得られます(すべての文字列などをエスケープした後、SQLインジェクションの警告)。

これは、電子メール入力とDBの列名が同じであることを前提としていますが、そうでない場合は、辞書を使用して列マッピングを設定するのは非常に簡単です。反対に、電子メールと列が同期している場合は、解析を行うために列の名前を知る必要はありません。

疑似辞書を反復処理して、パラメーター化されたSQL文字列の適切な場所に各キーと値のペアを出力できます。

お役に立てれば!

編集:これはPythonですが、C#/VB.netは同じ/類似の機能を備えている必要があります。

于 2008-10-02T06:56:24.530 に答える
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
于 2008-10-22T05:20:08.300 に答える