输入CSV文件并将其上传到MySQL DB

时间:2015-03-29 17:25:52

标签: php mysql csv mysqli

EDIT2:

我找到了一个适合我的解决方案,字符串将保存在$ v [0] [0],[1] [0],[2] [0] ...仍然不是perfekt,但我应该那样工作。

代码:(分隔符:&#34 ;;"和" \ 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文件:

  • category; question; a1; a2; a3; a4
  • 1;问题; A1; A2; A3; A4
  • 2;问题; A1; A2; A3; A4
  • 2;问题; A1; A2; A3; A4

现在我必须将这些问题添加到我的问题表中,我的问题是每个类别都从特定的id开始:cat 1从1开始,cat 2在1000,cat 3在2000 ...

例如:类别2的最后一个问题的ID为1012,因此需要在1013和1014插入csv文件中cat 2的问题。

我的想法是,在插入csv之前,我计算每个类别的行数,然后手动插入ID。 (例如:cat 2有12行,+ 1001将是第一个新问题的id)

有谁知道如何才能做到这一点?

1 个答案:

答案 0 :(得分:1)

首先将CSV加载到另一个表格。

LOAD DATA INFILE '/path/to/file.csv'
INTO TABLE tmp_table_name
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
;
  • 详细了解此命令here

然后计算id语句中的insert

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 questions:
id
cat
questionId
question
answers

Table answers:
questionId
answer

表格通过questionId链接