2017-05-02 10 views
0

Gravity Form list controlからデータを抽出しようとしています。文字列の内容をレコードセットとして返します

基本的に、リストコントロールを使用すると、Webフォーム(WordPressウェブサイト上に構築された)上にマルチカラムテーブルデータを収集することができます。ただし、ユーザーが提供する表とレコードはすべて、フォームのレコード提出用に1行のテキストに配置されます。

a:3:{i:0;a:3:{s:6:"ItemID";s:1:"1";s:4:"Name";s:10:"Dennis Dish";s:12:"Phone Number";s:12:"01225 123456";}i:1;a:3:{s:6:"ItemID";s:1:"2";s:4:"Name";s:13:"Sally Spatula";s:12:"Phone Number";s:12:"01225 654321";}i:2;a:3:{s:6:"ItemID";s:1:"3";s:4:"Name";s:10:"Terry Tins";s:12:"Phone Number";s:12:"01225 789456";}}

...と(単一のテキスト文字列としてまだ)このようにそれを返す:

は、私はこのような生の入力テキストを取るためにカスタムのスカラー関数を作成するために管理してきました

ItemID: 1 
Name: Dennis Dish 
Phone Number: 01225 123456 

ItemID: 2 
Name: Sally Spatula 
Phone Number: 01225 654321 

ItemID: 3 
Name: Terry Tins 
Phone Number: 01225 789456 

これは合理的に単純明快で便利でしたが、今では生の文字列をレコードのセットに戻すことができるものを書く必要があります。

その場合には、例えば、私は次のようなデータを持つテーブルを持っていた:このように、整然と列としてこれを返すの

| ID |   RawString   | 
|--------|-------------------------------| 
| 1 | a:3:{i:0;a:3:{s:6:"ItemID"... | 

は..instead:

| ID |   TidyString   | 
|--------|-------------------------------| 
| 1 | ItemID: 1 Name: Dennis Dish...| 

..I私は一部を識別することができた私のスカラー関数で

| ID | ItemID |  Name  | Phone Number | 
|--------|--------|---------------|--------------| 
| 1 | 1 | Dennis Dish | 01225 123456 | 
| 1 | 2 | Sally Spatula | 01225 654321 | 
| 1 | 3 | Terry Tins | 01225 789456 | 

:の線に沿って何かを返すようにする方法を探していそれを整理するのに役立った生の文字列フォーマットのS:

  • a:n:{...(非常に開始時には)そうa:3:{...は3つのレコードがある を意味し、あるレコード数を示します。
  • i:n;...はレコード番号を示しますので、i:0;...は最初の レコードを意味します。
  • a:n:{...(レコード内)
  • ので a:3:{ 3ペアこのレコードの列/値の があることを意味し、レコードに 列/値のペアの数を示します。
  • s:...は、次の列または値の文字数を示します。したがって、s:2...は、列または値の長さが2文字であることを示します。

生の文字列をインデントすることによって、これを視覚化しやすくなることがあります。

a:3:{ 
     i:0; 
      a:3:{ 
        s:2:"ItemID"; 
        s:1:"1"; 

        s:4:"Name"; 
        s:10:"Dennis Dish"; 

        s:12:"Phone Number"; 
        s:12:"01225 123456"; 
       } 
     i:1; 
      a:3:{ 
        s:2:"ItemID"; 
        s:1:"2"; 

        s:4:"Name"; 
        s:13:"Sally Spatula"; 

        s:12:"Phone Number"; 
        s:12:"01225 654321"; 
       } 

     i:2; 
      a:3:{ 
        s:2:"ItemID"; 
        s:1:"3"; 

        s:4:"Name"; 
        s:10:"Terry Tins"; 

        s:12:"Phone Number"; 
        s:12:"01225 789456"; 
       } 
    } 

私はどこ結果として、この生の文字列からデータを返すという点で始めるには本当にわからないんだけどと設定します。

何か指摘していただければ幸いです。

答えて

1

これはNGrams8Kの仕事です。あなたは、関数のコピーをダウンロードする場合は、これを行うことができます:

DECLARE @yourstring varchar(1000) = 
'a:3:{ 
    i:0; 
     a:3:{ 
       s:2:"ItemID"; 
       s:1:"1"; 

       s:4:"Name"; 
       s:10:"Dennis Dish"; 

       s:12:"Phone Number"; 
       s:12:"01225 123456"; 
      } 
    i:1; 
     a:3:{ 
       s:2:"ItemID"; 
       s:1:"2"; 

       s:4:"Name"; 
       s:13:"Sally Spatula"; 

       s:12:"Phone Number"; 
       s:12:"01225 654321"; 
      } 

    i:2; 
     a:3:{ 
       s:2:"ItemID"; 
       s:1:"3"; 

       s:4:"Name"; 
       s:10:"Terry Tins"; 

       s:12:"Phone Number"; 
       s:12:"01225 789456"; 
      } 
    }'; 

WITH 
names(itemID, ps) AS -- extract the names 
(
    SELECT 
    ROW_NUMBER() OVER (ORDER BY position), 
    SUBSTRING 
    (
     @yourstring, 
     position+7, 
     CHARINDEX(';', @yourstring, position+7)-(position+8) 
    ) 
    FROM dbo.NGrams8k(@yourstring, 7) 
    WHERE token = '"Name";' 
), 
phoneNbrs(itemID, ps) AS -- extract the phone numbers 
(
    SELECT 
    ROW_NUMBER() OVER (ORDER BY position), 
    SUBSTRING 
    (
     @yourstring, 
     position+15, 
     CHARINDEX(';', @yourstring, position+15)-(position+16) 
    ) 
    FROM dbo.NGrams8k(@yourstring, 15) 
    WHERE token = '"Phone Number";' 

) 
SELECT 
id = 1, 
n.itemID, 
[Name]   = SUBSTRING(n.ps, CHARINDEX('"', n.ps)+1, 100), 
[Phone Number] = SUBSTRING(p.ps, CHARINDEX('"', p.ps)+1, 30) 
FROM names n 
JOIN phoneNbrs p ON n.itemID = p.itemID; 

結果:あなたの記事、アランのため

| ID | ItemID |  Name  | Phone Number | 
|--------|--------|---------------|--------------| 
| 1 | 1 | Dennis Dish | 01225 123456 | 
| 1 | 2 | Sally Spatula | 01225 654321 | 
| 1 | 3 | Terry Tins | 01225 789456 | 
+0

おかげ - これは完全に消化し、私が得ることができる方法を理解するために私に時間がかかりますNGrams8Kは必要なものを返す機能を持っていますが、確かに興味深いものです。 –

+0

申し訳ありません - 最初のコードブロックで回答の残りの部分を最初に認識しませんでした。ありがとうございます - これはうまくいくようです。宣言された変数ではなくテーブルの列から '@ yourstring'を読み込むことができるように調整します。 –

+0

簡単な質問 - 上記の「位置」は何ですか?以前はキーワードとして見つけられておらず、その情報を見つけることができませんでした。 –

関連する問題