Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP或C#脚本解析CSV表值以填充一对多表_C#_Php_Database_Parsing_One To Many - Fatal编程技术网

PHP或C#脚本解析CSV表值以填充一对多表

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

我正在寻找一个示例,说明如何在一个表的字段中拆分逗号分隔的数据,并用这些单独的元素填充第二个表,以便生成一对多关系数据库模式。这可能很简单,但让我举个例子:

我将从一个表Widgets中的所有内容开始,它有一个“state”字段来包含具有该widget的状态:

表格:小部件

===============================
| 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"]);
    
  • 循环元素,写入新的CSV文件

    $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);
    
  • 完成后,将CSV文件加载到数据库中。您可以在mysql客户端中执行此操作:

    mysql> LOAD DATA INFILE 'states.csv' INTO TABLE STATES;
    mysql> LOAD DATA INFILE 'manytomany.csv' INTO TABLE WIDGET_ST;
    
  • 这似乎需要做很多工作,但使用LOAD DATA命令比一次插入一行要快20倍,因此如果数据集很大,这是值得的


    请回复您的评论:

    对,数据库里也有数据。事实证明,我上面展示的解决方案,转储到CSV文件并以规范化格式重新导入,比在拆分数据的循环中执行INSERT语句快了许多倍

    每个品牌的数据库都有自己的导入批量数据的工具。有关每个数据库的批量导入解决方案列表,请参见我的答案


    您应该使用每个数据库提供的工具。试图保持跨平台只会使您的代码。此外,在90%的情况下,当人们竭尽全力使自己的代码数据库独立时,事实证明他们从未使用过多个数据库。无论如何,你也无法实现完全的数据库独立性。

    我要告诉你一点——但我也在寻找更“跨平台”的东西,因为我的DBMS可能是SQL Server 2008或postgres等。我也已经有了数据库格式的原始表,我正试图根据需要使用更多的关系来更新它。还是谢谢你