0

ユーザーは、プレーン・テキストの電子メール・メッセージをApplication Expressにカット・アンド・ペーストし、電子メールのコンテンツを解析して表にレコードを移入できるようにしたいと考えています。電子メール メッセージは通常 10,000 ~ 20,000 文字なので、電子メールを VARCHAR2 または CLOB に入れることができます。

私が求めているのは、VARCHAR2 または CLOB に入力した後に、これらの電子メールを解析する方法のガイダンス / 疑似コード / ヒントです。

メッセージの形式は次のとおりです。

Item One: content for item one

Item Two: 

multiline content for item two
more multiline content for item two

*********************************    <- these asterisks are in the text
Section Header I don't care about
*********************************

Item Three: content for item three

等々。

項目ヘッダーは事前にわかっており、一定の定義済みの順序になっています。

これはOracleがホストするApexインスタンスに実装されるため、PL/SQLを介してこれを行うことを好みますが、そこでもJavaを使用できると思います(PL/SQLの方がはるかに好ましい)。

4

1 に答える 1

1

次のコードは、instr と substr の使用方法の例を示しています。さらに必要なのは、このコードをループに入れて l_header_first と l_header_next を設定し、必要なすべての値を取得できるようにすることだけです。

declare
   l_email        varchar2(32767);
   l_first        pls_integer;
   l_next         pls_integer;
   l_text         varchar2(32767);
   l_header_first varchar2(100);
   l_header_next  varchar2(100);

begin
   l_email := 'Item One: content for item one

Item Two: 

multiline content for item two
more multiline content for item two

*********************************    <- these asterisks are in the text
Section Header I don''t care about
*********************************

Item Three: content for item three';

   l_header_first := 'Item One:';
   l_header_next  := 'Item Two:';
   l_first        := instr(l_email, l_header_first) + length(l_header_first) + 1;
   l_next         := instr(l_email, l_header_next);

   l_text := substr(l_email, l_first, l_next - l_first);
   dbms_output.put_line('Found ' || l_header_first);
   dbms_output.put_line(l_text);

   l_header_first := 'Item Two:';
   l_header_next  := 'Item Three:';
   l_first        := instr(l_email, l_header_first) + length(l_header_first) + 1;
   l_next         := instr(l_email, l_header_next);

   l_text := substr(l_email, l_first, l_next - l_first);
   dbms_output.put_line('Found ' || l_header_first);
   dbms_output.put_line(l_text);

end;
于 2012-05-02T12:02:44.150 に答える