0

mssqlファイルの巨大なダンプがあります。file_get_contents()を介してそのファイルを読み取り、各行のIDに基づいてすべてを配列の束に配置したいと思います。残念ながら、IDはテーブルごとに異なる名前が付けられています。以下の行はすべて1つの特定の投稿に対するものです(同じIDを持つ29のエントリの中にあります)。以下の例では、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がキーである別の多次元配列を作成します。これには、で作成されたすべての関連するサブ配列が含まれているため、データをリンクして、後で別のデータベース用に正規化することができます。

実際にデータベースにクエリを実行せずに、PHPでこれを行う簡単な方法はありますか?データダンプしかありません。たくさんの場所でexplode()を実行できると思っていますが、IDが表示される順序に韻や理由がないため、IDが$sqlLineArray[2]などであるとは限りません。常にそうなるとは限りません。

mssql_fetch_array()の種類は適切なようですが、最初のパラメーターは、クエリ文字列だけでなく、リソースである必要があります。

4

2 に答える 2

1

アップデート

質問を読み直した後、SQL=>PHP配列から移行するという重要な要件を見逃しました。すべてのINSERTステートメントが標準化されているとすると、次の順序で解析する必要があります。

  1. 各行を見つけてINSERT
  2. 列リストを検索
  3. 値を見つける

これは迅速で汚い解決策です:

$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'、''、'作成者')

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'作成者')

最後に、このソリューションは、以下を含むアレイを準備しますNULL

$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')
于 2012-09-19T21:16:48.613 に答える
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>");
}
于 2012-09-19T21:30:52.187 に答える