2017-05-02 10 views
0

Gravity Form list control에서 데이터를 추출하려고합니다.문자열 집합의 내용을 레코드 집합으로 반환하십시오.

기본적으로 목록 컨트롤을 사용하면 웹 양식 (WordPress 웹 사이트에서 작성)에 여러 열 테이블 데이터를 수집 할 수 있습니다. 그러나 사용자가 제공하는 테이블과 레코드는 모두 폼의 레코드 제출을 위해 한 줄의 텍스트에 저장됩니다.

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...| 

을 .. 난

| 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

빠른 질문 - 위에 사용 된 '위치'는 무엇입니까? 이전에 키워드로 사용하지 않았으며 이에 대한 정보를 찾을 수 없습니다. –