【发布时间】:2021-12-13 07:26:31
【问题描述】:
有这个 mySQL 文件 (file.sql),我想复制起点和终点两点之间的文本并写入一个新的 .sql 文件。我在一个循环中需要这个,它将运行一个数组中的 N 个表并写入一个新的 .sql 文件。在每次迭代结束时,我需要添加新行然后将新表的文本附加到文件末尾的过程。
--DO NOT COPY
--DO NOT COPY
-- Table structure for table `address`
--
DROP TABLE IF EXISTS `address`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `address` (
`ENCODEDKEY` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`ADDRESSTYPE` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT
NULL,
`CITY` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `address`
--
LOCK TABLES `address` WRITE;
/*!40000 ALTER TABLE `address` DISABLE KEYS */;
INSERT INTO `address` VALUES ( 'ENCODEDKEY','ADDRESSTYPE','CITY');
/*!40000 ALTER TABLE `address` ENABLE KEYS */;
UNLOCK TABLES;
--DO NOT COPY
--DO NOT COPY
-- Table structure for table `client`
--
DROP TABLE IF EXISTS `client`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `client` (
`KEY` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`TYPE` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `client`
--
LOCK TABLES `client` WRITE;
/*!40000 ALTER TABLE `client` DISABLE KEYS */;
INSERT INTO `client` VALUES ( 'KEY','TYPE');
/*!40000 ALTER TABLE `address` ENABLE KEYS */;
UNLOCK TABLES;
--DO NOT COPY
--DO NOT COPY
对于每个迭代,起点应该是 = 的确切字符串
表'find_tablename'的表结构
结束点应该是 = 的确切字符串
解锁表格;
我想复制/读取这 2 点之间的所有文本并写入一个新的 .sql 文件。这个过程应该在一个循环中,循环将运行 N 个表,并在添加新行后附加到同一个 .sql 文件。在这种情况下,它将针对表地址和客户端运行 2 次迭代。
有这个脚本在 PowerShell 中为地址表执行进程。我还考虑在 cmets 中使用如下所示的 Array,它允许我轻松添加/删除我需要的表,然后使用 FOR LOOP 进行迭代。我在 cmets 中的代码是我试图添加以执行此循环的代码。因此位置 tableList[num] 的值将替换 address 。
# $tableList = New-Object -TypeName 'System.Collections.ArrayList';
# $tableList.Add("address")
# $tableList.Add("client")
# for ($num = 1 ; $num -le $tableList.Count ; $num++)
# {
$write = $false
$(switch -CaseSensitive -File ("file.sql") {
'-- Table structure for table `address`' { $write = $true; $_ }
'UNLOCK TABLES;' { if ($write) { $_; break; } }
default { if ($write) { $_ }}
}) | Set-Content "new_file.sql"
#}
【问题讨论】:
-
真的是一个固定的表格数组,还是要提取所有个表格?您应该删除
break并重置$write。此外,您可以在开关中使用字符串扩展:"-- Table structure for table $tableName" -
是的,一个固定的表格数组。因此,该文件具有超过 200 个表的结构,其中客户和地址是其中的 2 个。假设我想提取其中 10 个表的结构,然后将我需要的这些表的名称添加到数组列表中,并且循环应该运行 10 次以允许进程写入同一个 .sql 文件。
标签: powershell