CSV 文件格式

Posted

技术标签:

【中文标题】CSV 文件格式【英文标题】:CSV file formatting 【发布时间】:2015-11-18 17:33:10 【问题描述】:

我有问题:我需要能够使用 php 将 CSV 文件导入 MS Access 数据库。我有一个脚本可以做到,但是我的 不对。

原来的格式是:

但脚本使用以下格式:

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

我下面的导入脚本没有导入任何东西,也没有给出任何错误:

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++;

            

编辑当前代码:

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

【问题讨论】:

第一个是制表符分隔的。如果使用fgetcsv(),则只需将第三个参数更改为"\t" 用制表符 (\t) 替换逗号可能会有所帮助 或将, 替换为导入代码中的选项卡 需要看你的代码来帮忙 代码:while (($data = fgetcsv($handle, 1000,'\t',"'")) !== FALSE) 给出错误:注意:fgetcsv():分隔符必须成为单个字符 【参考方案1】:

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

由于您的新文件是制表符分隔的,因此它不会以逗号分隔。

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

$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++;


【讨论】:

错误:注意:未定义的偏移量:1 行:$names = explode(',', $data[1]); @JustinasT 那么这些毕竟不是标签 - 很难用截图来判断。尽管您现有的代码也会遇到同样的错误 文件格式为:File.csv。当使用文本编辑器打开时 - 它看起来像在屏幕截图中。在 excel 中打开时 - 它看起来像普通的 excel 文件,每个选项卡都在单独的单元格中(A-日期、B-姓氏、姓名、C-其他数据等)。 不知道如何检查? 你能在文本编辑器中打开,复制第一行 10 行并将其粘贴到 pastebin 吗?还是数据保密?

以上是关于CSV 文件格式的主要内容,如果未能解决你的问题,请参考以下文章

如何重新格式化 CSV 文件以匹配正确的 CSV 格式

怎么把转换成csv格式

怎么把压缩文件rar格式转化成csv格式?

CSV 文件格式

python存储数据的操作(csv格式文件,Excel表格文件)!!!

如何查看csv文件的编码格式,我只能在用 wps的Excel 里打开 ?