PHP或C#脚本解析CSV表值以填充一对多表
我正在寻找一个示例,说明如何在一个表的字段中拆分逗号分隔的数据,并用这些单独的元素填充第二个表,以便生成一对多关系数据库模式。这可能很简单,但让我举个例子: 我将从一个表Widgets中的所有内容开始,它有一个“state”字段来包含具有该widget的状态: 表格:小部件PHP或C#脚本解析CSV表值以填充一对多表,c#,php,database,parsing,one-to-many,C#,Php,Database,Parsing,One To Many,我正在寻找一个示例,说明如何在一个表的字段中拆分逗号分隔的数据,并用这些单独的元素填充第二个表,以便生成一对多关系数据库模式。这可能很简单,但让我举个例子: 我将从一个表Widgets中的所有内容开始,它有一个“state”字段来包含具有该widget的状态: 表格:小部件 =============================== | id | unit | states | =============================== |1 | abc | AL
===============================
| id | unit | states |
===============================
|1 | abc | AL,AK,CA |
-------------------------------
|2 | lmn | VA,NC,SC,GA,FL |
-------------------------------
|3 | xyz | KY |
===============================
==============================
| w_id | w_st_id | w_st_name |
------------------------------
|1 | 1 | AL |
|1 | 2 | AK |
|1 | 3 | CA |
|2 | 1 | VA |
|2 | 2 | NC |
|2 | 1 | SC |
|2 | 2 | GA |
|2 | 1 | FL |
|3 | 1 | KY |
==============================
现在,我想通过代码创建的是第二个表,它将连接到名为WIDGET_ST的WIDGET,例如,它有WIDGET id、WIDGET state id和WIDGET state name字段
表格:小部件
===============================
| id | unit | states |
===============================
|1 | abc | AL,AK,CA |
-------------------------------
|2 | lmn | VA,NC,SC,GA,FL |
-------------------------------
|3 | xyz | KY |
===============================
==============================
| w_id | w_st_id | w_st_name |
------------------------------
|1 | 1 | AL |
|1 | 2 | AK |
|1 | 3 | CA |
|2 | 1 | VA |
|2 | 2 | NC |
|2 | 1 | SC |
|2 | 2 | GA |
|2 | 1 | FL |
|3 | 1 | KY |
==============================
我正在学习C#和PHP,所以用这两种语言回答都会很好
谢谢。我编写了一些脚本将堆栈溢出数据转储导入SQL数据库。我拆分标记列表以填充您描述的多对多表。我使用了一种类似于以下的技术:
while ($row = $pdoStmt->fetch()) {
explode()
在逗号上拆分
$states = explode(",", $row["state"]);
$stateid = array();
$stfile = fopen("states.csv", "w+");
$mmfile = fopen("manytomany.csv", "w+");
$i = 0;
foreach ($state as $st) {
if (!array_key_exists($st, $stateid)) {
$stateid[$st] = ++$i;
fprintf($stfile, "%d,%s\n", $i, $st);
}
fprintf($mmfile, "%s,%s\n", $row["id"], $stateid[$st]);
}
fclose($stfile);
fclose($mmfile);
mysql> LOAD DATA INFILE 'states.csv' INTO TABLE STATES;
mysql> LOAD DATA INFILE 'manytomany.csv' INTO TABLE WIDGET_ST;
请回复您的评论: 对,数据库里也有数据。事实证明,我上面展示的解决方案,转储到CSV文件并以规范化格式重新导入,比在拆分数据的循环中执行INSERT语句快了许多倍 每个品牌的数据库都有自己的导入批量数据的工具。有关每个数据库的批量导入解决方案列表,请参见我的答案
您应该使用每个数据库提供的工具。试图保持跨平台只会使您的代码。此外,在90%的情况下,当人们竭尽全力使自己的代码数据库独立时,事实证明他们从未使用过多个数据库。无论如何,你也无法实现完全的数据库独立性。我要告诉你一点——但我也在寻找更“跨平台”的东西,因为我的DBMS可能是SQL Server 2008或postgres等。我也已经有了数据库格式的原始表,我正试图根据需要使用更多的关系来更新它。还是谢谢你