【问题标题】:Read CSV URL and import selected data to mysql with PHP读取 CSV URL 并使用 PHP 将所选数据导入 mysql
【发布时间】:2016-12-15 10:11:54
【问题描述】:

如何读取来自 URL 的 CSV 并使用 PHP 将选定的数据导入 mysql 表?

目前我使用 fopen() 将整个 CSV 导入表中。然后我根据需要过滤并在 html 上回显变量。

但为什么要导入整个 CSV 表,我只需要几个值?

【问题讨论】:

  • 请发布您的代码和预期结果。

标签: php mysql csv


【解决方案1】:

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

【讨论】:

  • 谢谢,我想我已经掌握了“概念”。但是理解部分还是有问题 $csvLines = [];关于二维数组?我的 $url (CSV URL) 有位置吗?感谢支持!
  • 我添加了一个小的 sn-p 来下载 CSV 文件并解析它:)
  • 感谢您分享 CSV - 我知道是我 - 但我在哪里可以找到附件?
  • 不,我在答案开头添加了一些 PHP 代码,他们会下载您选择的 CSV 文件 :)
  • 正如我所说,是我。知道了。谢谢,我会努力的。酷!
【解决方案2】:

关于上述解决方案,请记住一些事情。我刚刚实现了它,它运行良好。但是,如果您正在处理大量数据,一次插入一行将需要很长时间。

有时您别无选择,只能这样做,但如果您碰巧将记录插入到一​​个空表中,将 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);

【讨论】:

  • 是的。完全同意。我只是碰巧发布了一个旧逻辑。我不使用“死”。
  • 我从示例中删除了“die”,但我不确定您指的是什么语法错误。我复制了一段工作代码。刚刚重新测试过。
  • [$input file] 是一个数组。如何将字符串与数组连接起来?为什么变量名中有空格?为什么不使用预准备语句和数据绑定?
  • 哦,那个。是的你是对的。我是网络开发的新手。在那里,括号实际上意味着什么。当我为开发人员(非网络)编写需求时,我总是使用这些括号来表示这是你放置实际值的地方。我会改的。
猜你喜欢
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多