读取CSV URL并使用PHP导入MYSQL



如何读取来自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内容转储到temp文件中会快得多,将temp file的temp文件删除需要(在这种情况下是日期和临时),然后将文件上传到一个镜头中。

$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);

最新更新