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 文件格式的主要内容,如果未能解决你的问题,请参考以下文章