簡體   English   中英

PHP,從外部源插入 CSV 到 MySQL DB

[英]PHP, inserting CSV from external source into MySQL DB

我知道以前有人問過這個問題——我試圖閱讀之前關於這個主題的問答,但我仍然被卡住了。 可能我讀了太多的問答,結果是技術組合不好。

我沒有收到錯誤消息,只是我的表中沒有任何內容。 echo $i 是為了幫助調試,我只得到 0 而不是預期的 0 1 2 3 ... N 行。

我的數據庫連接憑據都很好,我在我的網站上使用它們進行 Select 語句。

    $csv_file = str_getcsv("https://ds.data.jma.go.jp/tcc/tcc/products/gwp/temp/list/csv/year_wld.csv"); 
    $csvfile = fopen($csv_file, 'r');
    $theData = fgets($csvfile);
    $i = 0; 

while (!feof($csvfile))
{
    echo $i;
   $csv_data[] = fgets($csvfile, 1024);
   $csv_array = explode(",", $csv_data[$i]);
   $yrr = $csv_array[0];
   $vals= $csv_array[1]; 
   $sql1 = "INSERT INTO Table1(Year,Value) VALUES(" .  $yrr . "," . $vals. ")";
   $conn->query($sql1); 
   $i++;
}

這里的主要問題是您試圖將文本變量作為文件打開:

$csvfile = fopen($csv_file, 'r');

事實上,你已經有一個來自str_getcsv的數組,所以你的整個代碼應該是這樣的(如果你可以一次讀取整個文件):

$csvFile = array_map('str_getcsv', file("https://ds.data.jma.go.jp/tcc/tcc/products/gwp/temp/list/csv/year_wld.csv"));
array_shift($csvFile); //we remove the headers
$i = 0;

/**
 * Removes all the "*" and "+" symbols as I assume that you want a float since you are not wrapping it in the sql query
 */
function removeUnwantedChars($string) {
    return preg_replace('/[^0-9\\.\\-]/i', '', $string);
}

foreach($csvFile as $csvData) {
    echo $i++;
    $yrr = $csvData[0];
    $vals = removeUnwantedChars($csvData[1]); 
    $sql1 = "INSERT INTO Table1(Year,Value) VALUES(" .  $yrr . "," . $vals. ")";
    $conn->query($sql1); 
}

如果您不能一次全部閱讀,那么我建議先逐行下載文件:

<?php
$url = "https://ds.data.jma.go.jp/tcc/tcc/products/gwp/temp/list/csv/year_wld.csv";
$fileHandle = fopen($url, "r");

/**
 * Removes all the "*" and "+" symbols
 */
function removeUnwantedChars($string) {
    return preg_replace('/[^0-9\\.\\-]/i', '', $string);
}

$i = 0;
$headersSkipped = false;
while ($csvData = fgetcsv($fileHandle)) {
    if (!$headersSkipped) {
        $headersSkipped = true;
        continue;
    }

    echo $i++;
    $yrr = $csvData[0];
    $vals = removeUnwantedChars($csvData[1]); 
    $sql1 = "INSERT INTO Table1(Year,Value) VALUES(" .  $yrr . "," . $vals. ")";
    $conn->query($sql1); 
}

fclose($fileHandle);

然而,就像上面@Shadow 所說的那樣,更詳細一點總是好的。 因此,如果query返回false那么輸出最后一個錯誤會很好(如果您使用 PDO,則使用errorInfo()函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM