【发布时间】:2016-12-15 10:11:54
【问题描述】:
如何读取来自 URL 的 CSV 并使用 PHP 将选定的数据导入 mysql 表?
目前我使用 fopen() 将整个 CSV 导入表中。然后我根据需要过滤并在 html 上回显变量。
但为什么要导入整个 CSV 表,我只需要几个值?
【问题讨论】:
-
请发布您的代码和预期结果。
如何读取来自 URL 的 CSV 并使用 PHP 将选定的数据导入 mysql 表?
目前我使用 fopen() 将整个 CSV 导入表中。然后我根据需要过滤并在 html 上回显变量。
但为什么要导入整个 CSV 表,我只需要几个值?
【问题讨论】:
CSV格式是纯文本:如果你只想得到几个字段,你还是得从头到尾读他。
要将数据从 CSV 导入 MySQL,您可以使用 PHP 生成 SQL 查询:
<?php
$csvData = file_get_contents('http://example.com/yourfile.csv');
$csvDelimiter = ';';
$csvLines = str_getcsv($csvData, "\n");
foreach($csvLines as &$row)
$row = str_getcsv($row, $csvDelimiter);
$pairings = [
// sql field -> csv column
'firstname' => 0,
'email' => 2,
'lastname' => 1
];
$pdo = new PDO(); // Connect to your database
$linesToImport = [];
foreach ($csvLines as $line) {
$currentLine = [];
foreach ($pairings as $sqlField => $csvColumn) {
$currentLine[] = isset($line[$csvColumn]) ? $pdo->quote($line[$csvColumn]) : 'null';
}
$linesToImport[] = implode(', ', $currentLine);
}
if (sizeof($linesToImport)) {
$query = 'INSERT INTO `YourTable` (`' . implode('`, `', array_keys($pairings)) . '`) VALUES (' . implode('), (', $linesToImport) . ')';
$pdo->exec($query);
}
满足您的特定需求:
<?php
$csvData = file_get_contents('http://example.com/yourfile.csv');
$csvDelimiter = ';';
$csvLines = str_getcsv($csvData, "\n");
foreach($csvLines as &$row)
$row = str_getcsv($row, $csvDelimiter);
$pdo = new PDO(); // Connect to your database
$lastTempDate = false;
$lastTemp = false;
foreach ($csvLines as $line) {
$date = $line[0];
$temp = $line[1];
if ($lastTempDate === false || $lastTempDate < $date) {
$lastTemp = $temp;
$lastTempDate = $date;
}
}
if ($lastTempDate !== false) {
$query = 'INSERT INTO `YourTable` (`date`, `temp`) VALUES (' . $pdo->quote($lastTempDate) . ', ' . $pdo->quote($lastTemp) . ')';
$pdo->exec($query);
}
【讨论】:
关于上述解决方案,请记住一些事情。我刚刚实现了它,它运行良好。但是,如果您正在处理大量数据,一次插入一行将需要很长时间。
有时您别无选择,只能这样做,但如果您碰巧将记录插入到一个空表中,将 URL 内容转储到临时文件会更快,只解析该临时文件中的那些列需要(在这种情况下是日期和温度),然后一次性上传文件。
$SQLLoadQuery = "LOAD DATA LOCAL INFILE `" . $input_file . "` INTO TABLE `" . $table_name . "` FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES (`date`,`temp`)";
$Recordset = mysqli_query($dbcon, $query);
【讨论】:
[$input file] 是一个数组。如何将字符串与数组连接起来?为什么变量名中有空格?为什么不使用预准备语句和数据绑定?