1

次のような電子メールを解析すると:

included_po~301993959 'VBCRLF

po_no~vendor~part_no~class~type_code~buyer~qty_ordered~measure~balance_on_order~cost~amt_ordered~order_date~delivery_date~ship_Date~receive_date~open~wo_no 'VBCRLF

301993959~100000~88008K~プローブ800~F~VAX~4.0~EA~4.0~100.3300~401.32000~011513~012313~012313~000000~Y~STOCK'VBCRLF 301993959~100000~TFCI-0~1 ~VAX~1.0~SP~1.0~12.6400~12.64000~011513~012313~012313~000000~Y~STOCK'VBCRLF 301993959~100000~TFIR-010-50~WIRE SPTEF~F~VAX~1.0~SP~1.0~12.6400 ~12.64000~011513~012313~012313~000000~Y~STOCK 'VBCRLF

コードの使用:

Public Sub AddItems()

Dim aLineItem() As String
Dim aItem() As String
Dim i As Integer
Dim j As Integer
Dim iCnt As Double
Dim msg
Dim Item As Items

ReDim sWo(0)
iCnt = 0
For i = 1 To UBound(sMsg())

aLineItem = Split(sMsg(i), vbCrLf)
For j = 1 To UBound(aLineItem)
    If aLineItem(j) <> "" Then
        If blah = 1 Then
            Debug.Print ("...." & aLineItem(j))
        End If
        aItem = Split(aLineItem(j), "~")
        If (aItem(0) <> "") And (aItem(0) <> "included_po") And (aItem(0) <> "po_no") Then
          Item.PO_num = GetWo(aItem(1))
            If Item.PO_num <> "0" Then
                Item.Company = aItem(1)
                Item.Delivery_date = aItem(12)
                Item.pn = aItem(2)
                Item.QTY_ordered = aItem(6)
                Item.Unit_Price = aItem(9)
            End If 'If Item.PO_num <> "0" Then
        End If 'If aItem(1) <> "" Then
    End If ' If aLineItem(j) <> "" Then
Next j
Next i
End Sub

メールの解析は次のようになります。

....301993959~100000~88008K~プローブ

....8800~F~VAX~4.0~EA~4.0~100.3300~401.32000~011513~012313~012313~000000~Y~S

....TOCK

このメールを解析するより良い方法はありますか?

編集#1:

Public Sub GetMailMsg()
Dim pop3 As jmail.pop3
Dim iCount As Integer
Dim i As Integer
Dim mailID As Integer
Dim j As Integer
Dim sSubject As String

j = 0

ReDim sMsg(0)

'connect to the mail box
Set pop3 = New pop3
pop3.Connect "REMOVED FOR SECURITY"


'Get message count
iCount = pop3.Count


'Read Messages
For i = 1 To iCount
 sSubject = pop3.Messages.Item(i).Subject
Label1.Caption = "Reading message.." & sSubject
DoEvents
If InStr(sSubject, "China Purchase Orders") <> 0 Then 'email test
j = j + 1
ReDim Preserve sMsg(j)
sMsg(j) = pop3.Messages.Item(i).Body
Label1.Caption = "Reading mail message for order " & sSubject
If blah = 1 Then
    Debug.Print ("Reading mail message for order " & sSubject)
    Debug.Print ("Reading mail message for order " & sMsg(j))
End If
End If
Next

pop3.Disconnect
Set pop3 = Nothing
End SUb

--編集#2

デバッグからの出力: 中国の注文書の注文に関するメール メッセージの読み取り

po_no~vendor~part_no~class~type_code~buyer~qty_ordered~measure~balance_o 'VBCRLF

n_order~cost~amt_ordered~order_date~delivery_date~ship_Date~receive_date 'VBCRLF

~open~wo_no 'VBCRLF

301993959~100000~88008K~プローブ'VBCRLF

8800~F~VAX~4.0~EA~4.0~100.3300~401.32000~011513~012313~012313~000000~Y~S'VBCRLF

TOCK 'VBCRLF

301993959~100000~TFCI-010-50~WIRE 'VBCRLF

SPTEF~F~VAX~1.0~SP~1.0~12.6400~12.64000~011513~012313~012313~000000~Y~ST'VBCRLF

OCK'VBCRLF

301993959~100000~TFIR-010-50~WIRE 'VBCRLF

SPTEF~F~VAX~1.0~SP~1.0~12.6400~12.64000~011513~012313~012313~000000~Y~ST'VBCRLF

OCK'VBCRLF

4

2 に答える 2

3

あなたの行が適切に分割されていないので、行に問題があると思いますaLineItem = Split(sMsg(i), vbCrLf)。正しくない行に何もないかどうかを確認してくださいvbCrLF

その行は連続した1行ですか?

編集 #1 @ 2013 年 1 月 16 日午後 1 時 16 分 EST:

ファイルを作成し、提供された入力を貼り付けました。簡単なプログラムを作成し、あなたのコードを組み込みました。以下の生成された DEBUG を参照してください。予想どおり、301993959 で始まり、STOCK で終わる 3 行で構成されています。これは正しく望ましい出力ですよね?

....301993959~100000~TFCI-010-50~WIRE SPTEF~F~VAX~1.0~SP~1.0~12.6400~12.64000~011513~012313~012313~000000~Y~STOCK ....301993959~100000~TFIR-010-50~WIRE SPTEF~F~VAX~1.0~SP~1.0~12.6400~12.64000~011513~012313~012313~000000~Y~STOCK ....301993959~100000~88008K~PROBE 800~F~VAX~4.0 ~EA~4.0~100.3300~401.32000~011513~012313~012313~000000~Y~STOCK

したがって、提供したコードは正常に機能しています。入力ファイルも問題ないと言う場合、それは問題がそのメールの読み方、特に入力方法にあることを意味しますsMsg()。そのコードを投稿できますか?

編集 #2 @ 2013 年 1 月 16 日午後 2 時 32 分 EST:

単一のレコード行に不要なvbCrLfs が含まれており、希望どおりに分割できません。これが私があなたに提案することです:

1) Body をそのままロードするのではなく、 to に変更できる場合は、不要なsGetMailMsgが生成されないように、1 行ずつ調べてください。vbCrLfポップ オブジェクトの経験がまったくないので、それが可能かどうかはわかりません。

2) 不要なcbCrLfs の数が一貫している場合 (例: 1 つのレコードに 2 つ)、このように分割されたレコードを連結するようにコードを調整するだけです。

DIM concatLine As String
For j = 1 To UBound(aLineItem) Step 3
    concatLine = aLineItem(j) & aLineItem(j+1) & aLineItem(j+2)
    If concatLine <> "" Then
        If blah = 1 Then
            Debug.Print ("...." & concatLine)
        End If
        aItem = Split(concatLine, "~")
        If (aItem(0) <> "") And (aItem(0) <> "included_po") And (aItem(0) <> "po_no") Then
          Item.PO_num = GetWo(aItem(1))
            If Item.PO_num <> "0" Then
                Item.Company = aItem(1)
                Item.Delivery_date = aItem(12)
                Item.pn = aItem(2)
                Item.QTY_ordered = aItem(6)
                Item.Unit_Price = aItem(9)
            End If 'If Item.PO_num <> "0" Then
        End If 'If aItem(1) <> "" Then
    End If ' If concatLine <> "" Then
Next j

3) またはさらに良いことに、レコードの最後に到達するまで文字列を連結し、連結された文字列を分割します。

DIM concatLine As String
DIM detailsRecord as Integer

For detailsRecord  = 1 To UBound(aLineItem)
    if LCase(Right(aLineItem(detailsRecord),5)) = 'wo_no' Then Exit For ' when we find this tag, we know where details record begin
Next detailsRecord 
For j = detailsRecord + 1 To UBound(aLineItem) ' begin looping detail records
    concatLine = concatLine + aLineItem(j)

    If UCase(Right(aLineItem(j), 5)) = "STOCK" Then ' this is your end of the record indicator
        If blah = 1 Then
            Debug.Print ("...." & concatLine)
        End If
        aItem = Split(concatLine, "~")
        If (aItem(0) <> "") Then
          Item.PO_num = GetWo(aItem(1))
            If Item.PO_num <> "0" Then
                Item.Company = aItem(1)
                Item.Delivery_date = aItem(12)
                Item.pn = aItem(2)
                Item.QTY_ordered = aItem(6)
                Item.Unit_Price = aItem(9)
            End If 'If Item.PO_num <> "0" Then
        End If 'If aItem(1) <> "" Then
    End If ' If concatLine <> "" Then
    concatLine = ""
Next j

ケース 2 と 3 では、最初にヘッダーを処理することを忘れないでください。 If (aItem(0) <> "") And (aItem(0) <> "included_po") And (aItem(0) <> "po_no")ヘッダー レコードを処理するには、メイン ループの外に移動する必要があります (最初の 2 つまたはレコードはヘッダーであると思います)。

編集 #3: シナリオ #3 を修正して、ヘッダー レコードをスキップし (「wo_no」がそのレコードの終わりのインジケーターであると仮定)、文字列を連結して、終了タグ ("STOCK") を検索して単一のレコードを形成するようにしました。 )。vbCrLfこのメソッドは、単一のレコードを予測できない数の文字列に分割する電子メール本文の動的な数の を処理するのに十分な柔軟性があります。

コードはブラウザで入力したものなので、動作することは保証できません :)

于 2013-01-16T17:02:18.170 に答える
0

各行を開始する必要があることがわかっているので、"301993959" を使用して Split 関数を使用します。

Dim LineItems(100) As String
x = Split(sMsg(i), "301993959")
For j = 1 To UBound(x) - 1 'Don't use 0 becuase you don't need that part
      LineItems(j - 1) = x(j)
Next i

もちろん、2 番目の区切り文字として "~" を使用して文字列内の各項目を分割することで、さらに一歩進めることができます。

Dim LineItems(100, 15) As String
x = Split(Text1.Text, "301993959")
For j = 1 To UBound(x) - 1 'Don't use 0 becuase you don't need that part
  y = Split(x(j), "~")
  For k = 1 To 15
    LineItems(j - 1, k) = y(k)
  Next k
Next j
于 2013-01-19T07:06:21.920 に答える