如何读取来自URL的CSV并使用PHP将选定的数据导入mysql表?
目前,我使用fopen()将整个CSV导入到表中。然后,我根据自己的需要进行筛选,并在html上回显变量。
但是为什么导入整个CSV表,我只需要几个值?
发布于 2016-12-15 10:23:00
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);
}发布于 2020-12-07 20:37:55
关于上面的解决方案要记住一些东西。我刚刚实现了它,它运行得很好。但是,如果您正在处理一组非常大的数据,每次插入一行将需要很长时间。
有时,您别无选择,只能这样做,但如果您碰巧将记录插入到空表中,则将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);https://stackoverflow.com/questions/41161538
复制相似问题