输入 CSV 文件并将其上传到 MySQL 数据库
Input CSV File and upload it to MySQL DB
编辑2:
好吧,我找到了一个适合我的解决方案,该字符串将保存在 $v[0][0]、[1][0]、[2][0] 中……仍然不完美,但我应该那样工作。
代码:(分隔符:“;”和“\n”)
$csvData = file_get_contents("data.csv");
$lines = preg_split("/[\n,;]+/", $csvData);
$array = array();
foreach($lines as $line){ $array[]= str_getcsv($line);}
编辑:
将 CSV 保存到数组可以解决我的问题,我会在 sql 插入中使用数组中的索引。
我尝试了以下代码,但它对我不起作用...
$csv = array_map('str_getcsv', file('data.csv'));
.
$csvData = file_get_contents($fileName);
$lines = explode(PHP_EOL, $csvData);
$array = array();
foreach ($lines as $line) {
$array[] = str_getcsv($line);
}
print_r($array);
当我回显 $array[0][0] 时,它显示了 HOWL 行。我真的不明白...第二个是这里的最佳答案:PHP CSV string to array
我必须上传这样的 csv 文件:
- 类别;问题;a1;a2;a3;a4
- 1;问题;a1;a2;a3;a4
- 2;问题;a1;a2;a3;a4
- 2;问题;a1;a2;a3;a4
现在我必须将这个问题添加到我的问题中 table,我的问题是每个类别都从一个特定的 ID 开始:类别 1 从 1 开始,类别 2 从 1000 开始,类别 3 从 2000 开始...... .
例如:类别 2 的最后一个问题的 ID 为 1012,因此需要在 1013 和 1014 处插入 csv 文件中类别 2 的问题。
我的想法是,在插入 csv 之前,我计算每个类别的行数,然后手动插入 ID。 (例如:cat 2 有 12 行,+ 1001 将是第一个新问题的 id)
有人知道我怎样才能完成这项工作吗?
首先将 CSV 加载到另一个 table。
LOAD DATA INFILE '/path/to/file.csv'
INTO TABLE tmp_table_name
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
;
- 阅读有关此命令的更多信息 here。
然后计算insert
语句中的id
。
INSERT INTO questions (id, cat, question, a1, a2, a3, a4)
SELECT
cat - 1 + 1000 + sq.number as id,
cat, question, a1, a2, a3, a4
FROM tmp_table_name t
JOIN (SELECT cat, count(*) as number FROM tmp_table_name GROUP BY cat) sq
ON t.cat = sq.cat
P.S.: 像 a1、a2、a3 和 a4 这样的列名(我假设 a 是答案的缩写?)闻起来像是非常糟糕的数据库设计。将答案放在单独的 table 和一栏中。
Table questions:
id
cat
questionId
question
answers
Table answers:
questionId
answer
table 是通过 questionId
链接的
编辑2:
好吧,我找到了一个适合我的解决方案,该字符串将保存在 $v[0][0]、[1][0]、[2][0] 中……仍然不完美,但我应该那样工作。
代码:(分隔符:“;”和“\n”)
$csvData = file_get_contents("data.csv");
$lines = preg_split("/[\n,;]+/", $csvData);
$array = array();
foreach($lines as $line){ $array[]= str_getcsv($line);}
编辑: 将 CSV 保存到数组可以解决我的问题,我会在 sql 插入中使用数组中的索引。
我尝试了以下代码,但它对我不起作用...
$csv = array_map('str_getcsv', file('data.csv'));
.
$csvData = file_get_contents($fileName);
$lines = explode(PHP_EOL, $csvData);
$array = array();
foreach ($lines as $line) {
$array[] = str_getcsv($line);
}
print_r($array);
当我回显 $array[0][0] 时,它显示了 HOWL 行。我真的不明白...第二个是这里的最佳答案:PHP CSV string to array
我必须上传这样的 csv 文件:
- 类别;问题;a1;a2;a3;a4
- 1;问题;a1;a2;a3;a4
- 2;问题;a1;a2;a3;a4
- 2;问题;a1;a2;a3;a4
现在我必须将这个问题添加到我的问题中 table,我的问题是每个类别都从一个特定的 ID 开始:类别 1 从 1 开始,类别 2 从 1000 开始,类别 3 从 2000 开始...... .
例如:类别 2 的最后一个问题的 ID 为 1012,因此需要在 1013 和 1014 处插入 csv 文件中类别 2 的问题。
我的想法是,在插入 csv 之前,我计算每个类别的行数,然后手动插入 ID。 (例如:cat 2 有 12 行,+ 1001 将是第一个新问题的 id)
有人知道我怎样才能完成这项工作吗?
首先将 CSV 加载到另一个 table。
LOAD DATA INFILE '/path/to/file.csv'
INTO TABLE tmp_table_name
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
;
- 阅读有关此命令的更多信息 here。
然后计算insert
语句中的id
。
INSERT INTO questions (id, cat, question, a1, a2, a3, a4)
SELECT
cat - 1 + 1000 + sq.number as id,
cat, question, a1, a2, a3, a4
FROM tmp_table_name t
JOIN (SELECT cat, count(*) as number FROM tmp_table_name GROUP BY cat) sq
ON t.cat = sq.cat
P.S.: 像 a1、a2、a3 和 a4 这样的列名(我假设 a 是答案的缩写?)闻起来像是非常糟糕的数据库设计。将答案放在单独的 table 和一栏中。
Table questions:
id
cat
questionId
question
answers
Table answers:
questionId
answer
table 是通过 questionId
链接的