【问题标题】:Issues with reading/uploading .csv files with php on mysql server在 mysql 服务器上使用 php 读取/上传 .csv 文件的问题
【发布时间】:2020-03-19 17:39:09
【问题描述】:

所以我尝试使用 PHP 构建网络“应用程序”,将银行对帐单从 .CSV 文件导入到 mySQL 数据库。但不幸的是,我的代码仍然存在一些缺陷,例如,当我运行此代码时,一切正常,除了:

  1. 如果 .CSV 文件包含特殊字符(如 (š,ž,č) 或“,”(用于浮点数)而不是读起来像新数组,但我想将“,”替换为“。”以便 mySQL 将数字识别为浮点数并用相似字符 (s,z,c) 替换特殊字符。
  2. 如果我在 .csv 文件中有一个标题,我希望跳过这个标题(第一行),可能最简单的方法是先读取文件并计算行数,这样我才能获得文件中的最大行数,然后使用 while 或 for 循环?像 while(($row>=2)
<?php
    $conn= mysqli_connect('localhost','admin','admin','database_test');
    if (isset($_POST['submit'])){
        $createTable="CREATE TABLE Bank_statements(
        id INT(3) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        date DATE NOT NULL,
        purpose TEXT(100) NOT NULL,
        debit FLOAT(255,2) NOT NULL,
        kredit FLOAT(255,2) NOT NULL
        );";
        if (mysqli_query($conn,$createTable)){
            $file=fopen($_FILES['file_nkbm']['tmp_name'],"r");
            while($data=fgetcsv($file)){
                foreach($data as $dat){
                    $expl=explode(";",$dat);
                    $convert_date=strtotime($expl[4]);
                    $date=date('y-m-d',$convert_date);
                    $debit=doubleval($expl[5]);
                    $kredit=doubleval($expl[6]);
                    $purpose=$expl[8];
                    $addData="INSERT INTO Bank_statements(date,debit,kredit,purpose) VALUES 
                    ('$date','$debit','$kredit','$purpose');";
                    if (mysqli_query($conn,$addData)){
                        echo "success";
                    }else{
                        echo "fail".mysqli_error($conn);
                    }
                }
            }
            fclose($_FILES['file_nkbm']['tmp_name']);
            $query="SELECT * FROM Bank_statements;";
            $result=mysqli_query($conn,$query);
            while ($row=mysqli_fetch_array($result)){
                echo $row['id'].$row['date'].$row['purpose'].$row['debit'].$row['kredit']."<br>";
            }
        }else{
            echo "table already exist";
        }
    }
    mysqli_close($conn);
?>

如果我尝试手动编辑 .csv 文件,结果还可以,但这不是程序的重点或目标。

【问题讨论】:

  • 扔掉第 1 行 = 只需在 while 循环之前读取一行并将其扔掉(即不要对它做任何事情
  • , 更改为.str_replace(',', '.', The field with the comma in)
  • 您目前正在列级别执行(尝试的)行逻辑

标签: php mysql sql csv


【解决方案1】:

我终于得到了正确的结果,所以我的代码目前看起来是这样的:

<?php
    $conn= mysqli_connect('localhost','admin','admin','database_test');
    if (isset($_POST['submit'])){
        $createTable="CREATE TABLE Bank_statements(
        id INT(3) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        date DATE NOT NULL,
        purpose TEXT(100) NOT NULL,
        debit FLOAT(255,2) NOT NULL,
        kredit FLOAT(255,2) NOT NULL
        );";
        if (mysqli_query($conn,$createTable)){
            $file=fopen($_FILES['file_nkbm']['tmp_name'],"r");
            $row=1;
            while($data=fgetcsv($file,1000,'~')){
                $repl_one=str_replace(',','.',$data);
                $repl=preg_replace('/[\x00-\x1F\x7F-\xFF]/','?',$repl_one);
                $row++;
                if ($row!=2){
                    foreach($repl as $dat){
                        $expl=explode(";",$dat);
                        $convert_date=strtotime($expl[4]);
                        $date=date('y-m-d',$convert_date);
                        $debit=doubleval($expl[5]);
                        $kredit=doubleval($expl[6]);
                        $purpose=$expl[8];
                        $addData="INSERT INTO Bank_statements(date,debit,kredit,purpose) 
                                  VALUES ('$date','$debit','$kredit','$purpose');";
                        mysqli_query($conn,$addData);
                    }
                }
            }
            fclose($_FILES['file_nkbm']['tmp_name']);
            $query="SELECT * FROM Bank_statements;";
            $result=mysqli_query($conn,$query);
            while ($row=mysqli_fetch_array($result)){
                echo $row['id'].$row['date'].$row['purpose'].$row['debit'].$row['kredit']."<br>";
            }
        }else{
            echo "table already exist";
        }
    }
    mysqli_close($conn);
?>

使用变量$row 我解决了跳过第一行的问题,使用str_replacepreg_replace 我解决了文件中的点和特殊字符的问题。但是我不得不将fgetcsv分隔符设置为“,”以外的某个字符,因为当程序读取文件时,它遇到“,”时会将一行拆分为新数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2011-03-08
    • 2015-04-14
    相关资源
    最近更新 更多