【问题标题】:Import CSV which contains additional commas into MySQL将包含附加逗号的 CSV 导入 MySQL
【发布时间】:2018-10-30 11:30:05
【问题描述】:

我的 CSV 文件在导致问题的特定列中有一些额外的逗号。当我将它导入 MySQL 时,该特定列中的数据被分成 2 列。你能帮我解决这个问题吗?谢谢。

注意 1:我不允许在我的服务器上使用 Load Data Local Infile,所以这不是一个可以考虑的选项。

注意 2:我不精通 PHP,所以如果您能显示正确的代码,我将不胜感激。

注意 3. 附加逗号位于 $Club_Name 列中。但是,将来其他列中可能还会出现额外的逗号,因此我正在寻找一个完整的解决方案来清除所有列中所有不相关的逗号。

我的代码(经过几天的努力):

<?php 
include("/path/to/the/database/connection/db_connect.php");

$filename = fopen("/path/to/the/csv/file/clubperformance_District_102.csv", "r");
//open the csv file
if ($filename) {
$firstline = fgets($filename, 4096);
    while (($line = fgets($filename)) !== false) {
         $lineArr = explode(",", "$line");
         var_dump($lineArr); // to display the array
         $lineArr = preg_replace("/[^a-zA-Z0-9 ]/", "", $lineArr); //clean up everything except alpha numeric characters & spaces

// list all the variables representing the database columns            
list($District, $Division, $Area, $Club_Number, $Club_Name, $Club_Status, $Mem_Base, $Active_Members, $Goals_Met, $CCs, $Add_CCs, $ACs, $Add_ACs, $CL_AL_DTMs, $Add_CL_AL_DTMs, $Level_1, $Level_2, $Add_Level_2, $Level_3, $Level_4, $Level_5, $New_Members, $Add_New_Members, $Off_Trained_Round_1, $Off_Trained_Round_2, $Mem_dues_on_time_Oct, $Mem_dues_on_time_Apr, $Off_List_On_Time, $Club_Distinguished_Status, $Last_Updated) = $lineArr;

// and then insert data
mysqli_query($GLOBALS["___mysqli_ston"], "INSERT INTO `toastmaster_dcp_tracking_old`(`District`, `Division`, `Area`, `Club_Number`, `Club_Name`, `Club_Status`, `Mem_Base`, `Active_Members`, `Goals_Met`, `CCs`, `Add_CCs`, `ACs`, `Add_ACs`, `CL_AL_DTMs`, `Add_CL_AL_DTMs`, `Level_1`, `Level_2`, `Add_Level 2`, `Level_3`, `Level_4`, `Level_5`, `New_Members`, `Add_New_Members`, `Off_Trained_Round_1`, `Off_Trained_Round_2`, `Mem_dues_on_time_Oct`, `Mem_dues_on_time_Apr`, `Off_List_On_Time`, `Club_Distinguished_Status`, `Last_Updated`) VALUES ('$District', '$Division', '$Area', '$Club_Number', '$Club_Name', '$Club_Status', '$Mem_Base', '$Active_Members', '$Goals_Met', '$CCs', '$Add_CCs', '$ACs', '$Add_ACs', '$CL_AL_DTMs', '$Add_CL_AL_DTMs', '$Level_1', '$Level_2', '$Add_Level_2', '$Level_3', '$Level_4', '$Level_5', '$New_Members', '$Add_New_Members', '$Off_Trained_Round_1', '$Off_Trained_Round_2', '$Mem_dues_on_time_Oct', '$Mem_dues_on_time_Apr', '$Off_List_On_Time', '$Club_Distinguished_Status', '$Last_Updated')")or die(((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)));

    }

    fclose($filename);
}
?>

【问题讨论】:

  • 您已经标记了 fgetcsv,但您实际上并没有使用该功能......使用它可能会有所帮助。您天真地用逗号分隔每一行,而没有考虑它们实际上是字段的分隔符还是数据的一部分。您没有向我们展示任何有问题的源数据,但在一个有效的 CSV 文件中,我希望如果一个字段包含任何类似的特殊字符,该字段将用双引号引起来。你是这种情况吗?无论如何,使用像 fgetcsv 这样的专用函数应该有助于处理这些细节,你可以在网上找到有关它的教程
  • 不是一个很有帮助的答案。
  • 这不是一个答案,它只是一个评论 - 故意这样:-)。你没有向我们展示你有问题的数据,所以我能做的最好的就是做出一些假设和建议。我已经解释了问题可能是什么,但我不能 100% 确定解决方案是什么,因为没有数据我无法重现您的问题。但我可以很确定,使用您(错误地)标记问题的实际 CSV 库可能会让您的生活更轻松。您已经可以在网上找到相关的教程和文档,我不确定您是否真的需要任何人在这里再写一篇。
  • 不管怎样,实际上这个问题可能是How to extract data from csv file in PHP的副本
  • 您提供的这个链接很有用。谢谢。我很感激。 stackoverflow.com/questions/2805427/…我的解决方案很快就会出现,以帮助其他面临同样困境的人。

标签: mysql fgetcsv


【解决方案1】:

基本上这些是我编辑的行。其余的都是一样的。希望它可以帮助某人。

if ($filename) {
    $firstline = fgetcsv($filename, 1000);
        while (($line = fgetcsv($filename)) !== false) {
        var_dump($line); // to display the array
             $line = preg_replace("/[^a-zA-Z0-9 ]/", "", $line); //clean up the mess, if any

    // list all the variables representing the database columns          
    list($District, $Division, $Area, $Club_Number, $Club_Name, $Club_Status, $Mem_Base, $Active_Members, $Goals_Met, $CCs, $Add_CCs, $ACs, $Add_ACs, $CL_AL_DTMs, $Add_CL_AL_DTMs, $Level_1, $Level_2, $Add_Level_2, $Level_3, $Level_4, $Level_5, $New_Members, $Add_New_Members, $Off_Trained_Round_1, $Off_Trained_Round_2, $Mem_dues_on_time_Oct, $Mem_dues_on_time_Apr, $Off_List_On_Time, $Club_Distinguished_Status, $Last_Updated) = $line;

【讨论】:

    猜你喜欢
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    相关资源
    最近更新 更多