MSSQL转储为PHP数组

时间:2012-09-19 21:11:08

标签: php sql multidimensional-array

我有一个巨大的mssql文件转储。我想通过file_get_contents()读取该文件,并根据每行的ID将其全部放入一堆数组中。不幸的是,ID在不同的表中被命名为不同的东西。下面的行全部用于一个特定的帖子(并且是29个具有相同ID的条目)。以下示例中的ID为1234567890。

示例:

下面的[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')

下面的[ContentID]

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

下面的[ItemID]

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)

基本上我要做的就是首先从这些行中形成一个数组,所以第一个就像是

$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是键,并且它具有刚刚在in中创建的所有关联子数组,所以我有点将数据链接在一起,我可以在以后将其标准化为另一个数据库。

有没有一种简单的方法可以使用PHP而不实际查询数据库?我只有一个数据转储。我想我可以在一堆地方爆炸(),但是ID出现的顺序没有押韵或理由,所以我不一定说ID是$ sqlLineArray [2]或其他东西,因为它是并不总是那样。

mssql_fetch_array()似乎是合适的,但第一个参数必须是资源,而不仅仅是查询字符串。

2 个答案:

答案 0 :(得分:1)

<强>更新

重新阅读问题后,我错过了从SQL =&gt;开始的重要要求。 PHP数组。鉴于所有INSERT语句都是标准化的,您必须按以下顺序进行解析:

  1. 查找每个INSERT
  2. 查找列表
  3. 查找值

  4. 这是一个快速而肮脏的解决方案:

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

    <强>结果

    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')

    此解决方案将彻底准备您的数组,省略NULL s:

    $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')

答案 1 :(得分: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>");
}