2012-09-19 4 views
0

나는 거대한 mssql 파일을 가지고있다. 나는 file_get_contents()를 통해 그 파일을 읽고, 각 줄의 ID를 기반으로 한 묶음의 배열에 모든 것을 집어 넣고 싶다. 불행히도, ID는 다른 테이블에서 다른 이름을 갖습니다. 아래의 행은 모두 특정 게시물에 대한 것이며 (ID가 같은 29 개의 항목 중 하나임) 아래 예에서 ID는 1234567890입니다.PHP 배열로 MSSQL 덤프

예 :

[ID] 그래서 기본적으로 내가했던 것과

INSERT [dbo].[sf_VrsTxtData] ([Application], [ItemID], [CultureID], [Version], [KeyValue], [DataImpl], [HasDynamicLinks], [TypeCode]) VALUES (N'/', N'1234567890', 101, 1, N'Thumbnail', N'/news/images/thumbnail.jpg', 0, 18) 

아래

INSERT [dbo].[sf_CmsTaggedContent] ([Application], [ContentID], [TagID], [Owner]) VALUES (N'/News', N'1234567890', N'3434', N'author') 

[항목 ID] 아래

INSERT [dbo].[sf_CmsContentBase] ([Application], [ID], [MimeType], [StreamingProviderName], [ParentID], [Url], [LoweredUrl], [CommentsCount], [ItemInfo], [Creator]) VALUES (N'/News', N'1234567890', N'text/html', NULL, NULL, N'/2012/URL', N'/2012/url', 0, NULL, N'author') 

[콘텐츠 ID] 아래 각각의 자체 라인은 먼저, 첫 번째는, 내가 그 배열의 각을 통해 foreach는 것 그리고

$sqlLineArray = array(
    'Application'   => '/News', 
    'ID'     => '1234567890', 
    'MimeType'    => 'text/html', 
    'StreamingProviderName' => NULL, 
    'ParentID'    => NULL, 
    'Url'     => '/2012/URL', 
    'LoweredUrl'   => '/2012/url', 
    'CommentsCount'   => '0', 
    'ItemInfo'    => NULL, 
    'Creator'    => 'author' 
); 

같을 ID 명명의 차이에 대한 몇 가지 조건문을 적용하고, ID가 어디 다음 다른 다차원 배열을 할 수 있도록 키를 가지고 있으며, 그 안에 연결된 하위 배열의 모든 것을 가지고 있으므로, 나는 데이터를 서로 링크하고 나중에 다른 데이터베이스로 정규화 할 수 있습니다.

실제로 데이터베이스를 쿼리하지 않고도 PHP로이를 수행 할 수있는 쉬운 방법이 있습니까? 데이터 덤프 만 있습니다. 나는 여러 곳에서 폭발 할 수 있다고 생각하고 있지만 ID가 나타나는 순서에는 운이나 이유가 없으므로 ID가 $ sqlLineArray [2] 또는 그 이상이라고 말할 수는 없다. 항상 그런 것은 아닙니다.

mssql_fetch_array() 종류는 적당하지만 첫 번째 매개 변수는 쿼리 문자열이 아닌 리소스 여야합니다.

답변

1

업데이트

질문을 다시 읽은 후, 나는 SQL => PHP 배열에서가는 중요한 요구 사항을 놓쳤다.이것은

  • 이 열 목록을
  • 찾기 값

  • 찾기,

    1. INSERT 행을 찾습니다 감안할 때 모든 INSERT 문이 표준화되어, 당신이 순서대로 구문 분석 할 것 신속하고 더러운 해결책 :

      $sql = "INSERT INTO [dbo].[table]"; 
      
      //Implode keys 
      $sql .= " ([" . implode("], [", array_keys($sqlLineArray)) . "])"; 
      
      //Implode values 
      $sql .= " VALUES ('" . implode("', '", $sqlLineArray) . "') "; 
      
      (210)

      이 솔루션은 철저하게 배열 NULL의 생략 준비

      INSERT INTO [dbo].[table] ([Application], [ID], [MimeType], [StreamingProviderName], 
      [ParentID], [Url], [LoweredUrl], [CommentsCount], [ItemInfo], [Creator]) VALUES ('/News', 
      '1234567890', 'text/html', '', '', '/2012/URL', '/2012/url', '0', '', 'author')

      결과 :

      $cmd = "INSERT INTO [dbo].[table]"; 
      
      foreach($sqlLineArray as $key=>$val) { 
          if(isset($val)) { 
          $colList[] = '[' . $key . ']'; 
      
          if(is_numeric($val)) { 
           $valList[] = $val; 
          } 
          else { 
           $valList[] = "N'" . $val . "'"; 
          } 
          } 
      } 
      
      $sql = $cmd . '(' . implode(", ", $colList) . ') VALUES (' . implode(", ", $valList) . ')'; 
      

      결과

      INSERT INTO [dbo].[table]([Application], [ID], [MimeType], [Url], [LoweredUrl], 
      [CommentsCount], [Creator]) VALUES (N'/News', 1234567890, N'text/html', 
      N'/2012/URL', N'/2012/url', 0, N'author')
      마지막으로

      을,이 솔루션은 다음과 같은 배열을 준비 NULL S :

      $cmd = "INSERT INTO [dbo].[table]"; 
      
      foreach($sqlLineArray as $key=>$val) { 
          $colList[] = '[' . $key . ']'; 
      
          if(is_numeric($val)) { 
          $valList[] = $val; 
          } 
          elseif(isset($val)) { 
          $valList[] = "N'" . $val . "'"; 
          } 
          else { 
          $valList[] = 'NULL'; 
          } 
      } 
      
      $sql = $cmd . '(' . implode(", ", $colList) . ') VALUES (' . implode(", ", $valList) . ')'; 
      

      결과

      INSERT INTO [dbo].[table]([Application], [ID], [MimeType], [StreamingProviderName], 
      [ParentID], [Url], [LoweredUrl], [CommentsCount], [ItemInfo], [Creator]) VALUES 
      (N'/News', 1234567890, N'text/html', NULL, NULL, N'/2012/URL', N'/2012/url', 0, NULL, N'author')
    0

    내가 njks 솔루션을 좋아하지만, 나는 또한 경우 누군가 내 자신 끔찍한 솔루션을 내놓았다 관심이 :

    $data = file_get_contents('relevantlinesoriginal.sql'); 
    $lines = explode("\n",$data); 
    foreach ($lines as $line) { 
        $noInsert = explode("] (", $line); 
        $noInsert = array_pop($noInsert); 
        $separatingNamesAndValues = explode(") VALUES (N'", $noInsert); 
        $namesString = $separatingNamesAndValues[0]; 
        $valuesString = $separatingNamesAndValues[1]; 
        $names = str_replace(array('[',']'), "", $namesString); 
        $values = substr_replace($valuesString, "", -2); 
        $names = explode(', ', $names); 
        $values = explode(', ', $values); 
        $finalArray = array_combine($names, $values); 
        var_dump("<pre>", $finalArray, "</pre>"); 
    }