我有一个巨大的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()似乎是合适的,但第一个参数必须是资源,而不仅仅是查询字符串。
答案 0 :(得分:1)
<强>更新强>
重新阅读问题后,我错过了从SQL =&gt;开始的重要要求。 PHP数组。鉴于所有INSERT
语句都是标准化的,您必须按以下顺序进行解析:
INSERT
行这是一个快速而肮脏的解决方案:
$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>");
}