首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CSV文件格式

CSV文件格式
EN

Stack Overflow用户
提问于 2015-11-18 17:33:10
回答 1查看 159关注 0票数 1

我有个问题:我需要能够用PHP将CSV文件导入MS Access数据库。我有一个脚本可以这样做,但我的CSV文件格式是不正确的。

最初的格式是:

但该脚本适用于这种格式:

这两个文件都是.csv。如何将第一种文件格式转换为所需的文件格式?

下面的导入脚本没有导入任何内容,也没有出现任何错误:

代码语言:javascript
复制
if (isset($_POST['submit'])) {
            $i=0;
            require "connection.php";
            if (is_uploaded_file($_FILES['csv']['tmp_name'])) {
                echo "<h3>" . "File ". $_FILES['csv']['name'] ." uploaded successfully." . "</h3>";
            }
            //Import uploaded file to Database
            $handle = fopen($_FILES['csv']['tmp_name'], "r");
            $import=$db->prepare("INSERT INTO adherence(
                    dateandtime,
                    lastname,
                    firstname,
                    paidtime,
                    approvedtime,
                    notadhering)VALUES(
                    ?,?,?,?,?,?)");
            while (($data = fgetcsv($handle, 1000,"\t","'")) !== FALSE) {
                if($i>0) {
                $data = str_replace('"', '', $data);
                $myDate =  date("Y/m/d",strtotime(str_replace('/','-',$data[0])));
                $import->bindParam(1, $myDate, PDO::PARAM_STR);
                $import->bindParam(2, $data[1], PDO::PARAM_STR);
                $import->bindParam(3, $data[2], PDO::PARAM_STR);
                $import->bindParam(4, $data[3], PDO::PARAM_STR);
                $import->bindParam(5, $data[4], PDO::PARAM_STR);
                $import->bindParam(6, $data[5], PDO::PARAM_STR);
                str_replace('"',' ',$data);
                $import->execute();
                }
                $i++;

            }

编辑当前代码:

代码语言:javascript
复制
<?php
        if (isset($_POST['submit'])) {
            $i=0;
            require "connection.php";
            if (is_uploaded_file($_FILES['csv']['tmp_name'])) {
                echo "<h3>" . "File ". $_FILES['csv']['name'] ." uploaded successfully." . "</h3>";
            }
            //Import uploaded file to Database
            $handle = fopen($_FILES['csv']['tmp_name'], "r");
            $import=$db->prepare("INSERT INTO adherence(
                    dateandtime,
                    lastname,
                    firstname,
                    paidtime,
                    approvedtime,
                    notadhering)VALUES(
                    ?,?,?,?,?,?)");
            $badlines=[];
while (($data = fgetcsv($handle, 1000,"\t",'"')) !== FALSE) {
    if($i>0) {
        //skip but keep track of bad data
        if(count($data) !== 5){
            $badlines[] = $i;
            continue;
        }
        $myDate =  date("Y/m/d",strtotime(str_replace('/','-',$data[0])));
        $names = explode(',', $data[1]);
        $import->bindParam(1, $myDate, PDO::PARAM_STR);
        $import->bindParam(2, $names[0], PDO::PARAM_STR);
        $import->bindParam(3, $names[1], PDO::PARAM_STR);
        $import->bindParam(4, $data[2], PDO::PARAM_STR);
        $import->bindParam(5, $data[3], PDO::PARAM_STR);
        $import->bindParam(6, $data[4], PDO::PARAM_STR);
        $import->execute();
    }
    $i++;

}
            $removal=$db->prepare("delete FROM adherence WHERE approvedtime = '0' OR notadhering IS NULL");
            $removal->execute();

            fclose($handle);
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-18 19:19:23

"name, lastname"是一个单列,因为它被双引号包围。您的代码最初是在错误配置fgetscsv的情况下工作的,它将一个单引号作为附件参数传递,导致它忽略这些双引号,并将单列视为包含逗号的两列。

由于您的新文件是标签删除,它不会分割在逗号上。

若要修复,请将正确的附件参数传递给fgetcsv,并自己拆分该列:

代码语言:javascript
复制
$badlines=[];
while (($data = fgetcsv($handle, 1000,"\t",'"')) !== FALSE) {
    if($i>0) {
        //skip but keep track of bad data
        if(count($data) !== 5){
            $badlines[] = $i;
            continue;
        }
        $myDate =  date("Y/m/d",strtotime(str_replace('/','-',$data[0])));
        $names = explode(',', $data[1]);
        $import->bindParam(1, $myDate, PDO::PARAM_STR);
        $import->bindParam(2, $names[0], PDO::PARAM_STR);
        $import->bindParam(3, $names[1], PDO::PARAM_STR);
        $import->bindParam(4, $data[2], PDO::PARAM_STR);
        $import->bindParam(5, $data[3], PDO::PARAM_STR);
        $import->bindParam(6, $data[4], PDO::PARAM_STR);
        $import->execute();
    }
    $i++;

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33786616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档