Php CSV文件格式
我有个问题:我需要能够用PHP将CSV文件导入MS Access数据库。我有一个脚本可以做到这一点,但我的CSV文件格式不正确 原始格式为: 但脚本使用这种格式: 两个文件都是.csv。如何将第一种文件格式转换为所需的格式 下面的导入脚本没有导入任何内容,也没有给出任何错误:Php CSV文件格式,php,csv,ms-access,export-to-csv,Php,Csv,Ms Access,Export To Csv,我有个问题:我需要能够用PHP将CSV文件导入MS Access数据库。我有一个脚本可以做到这一点,但我的CSV文件格式不正确 原始格式为: 但脚本使用这种格式: 两个文件都是.csv。如何将第一种文件格式转换为所需的格式 下面的导入脚本没有导入任何内容,也没有给出任何错误: if (isset($_POST['submit'])) { $i=0; require "connection.php"; if (is_upl
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++;
}
if(isset($\u POST['submit'])){
$i=0;
需要“connection.php”;
如果(是否上载了文件($文件['csv']['tmp\U名称]])){
echo“.”文件“$\u文件['csv']['name']”已成功上载。“”;
}
//将上载的文件导入数据库
$handle=fopen($_文件['csv']['tmp_名称'],“r”);
$import=$db->prepare(“插入到(
日期和时间,
姓,
名字,
paidtime,
批准的时间,
notadhering)值(
?,?,?,?,?,?)");
while(($data=fgetcsv($handle,1000,“\t”,”)!==FALSE){
如果($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_替换(“,”$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);
}
“name,lastname”
是一个单列,因为它被双引号包围。
您的代码最初在错误配置fgetscsv时工作,将单引号作为附件参数传递,导致它忽略这些双引号,并将单列视为两列,因为它包含逗号
由于您的新文件是按制表符删除的,因此不会在逗号上拆分
要修复此问题,请将正确的enclosure参数传递给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++;
}
“name,lastname”
是一个单列,因为它被双引号包围。
您的代码最初在错误配置fgetscsv时工作,将单引号作为附件参数传递,导致它忽略这些双引号,并将单列视为两列,因为它包含逗号
由于您的新文件是按制表符删除的,因此不会在逗号上拆分
要修复此问题,请将正确的enclosure参数传递给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++;
}
第一个参数是以制表符分隔的。如果使用fgetcsv()
,则只需将第三个参数更改为“\t”
。将逗号替换为制表符(\t)可能有帮助,或者将导入代码中的,
替换为制表符需要查看代码以帮助代码:while($data=fgetcsv($handle,1000,'\t',“'))!==FALSE){给出错误:注意:fgetcsv():分隔符必须是单个字符第一个是制表符分隔的。如果使用fgetcsv()
,则只需将第三个参数更改为“\t”
。将逗号替换为制表符(\t)可能会有帮助,或者将导入代码中的,
替换为制表符需要查看代码以帮助代码:while($data=fgetcsv($handle,1000,'\t',“')!==FALSE){Gives error:Notice:fgetcsv():分隔符必须是单个字符错误:Notice:Undefined offset:1行:$names=explode(',',$data[1])@JustinasT那么这些毕竟不是选项卡-很难用屏幕截图来分辨。虽然你现有的代码文件格式也会有相同的错误:File.csv。当用文本编辑器打开时,它看起来像在屏幕截图中。当用excel打开时,它看起来像普通的excel文件,每个选项卡都在单独的单元格中(A-date、B-lastname、name、C-Other data等)。不知道如何检查它?您可以在文本编辑器中打开,复制前10行并粘贴到pastebin吗?或者数据是机密的吗?错误:注意:未定义的偏移量:1行:$names=explode(',',$data[1])@JustinasT那么这些毕竟不是选项卡-很难用屏幕截图来分辨。虽然你现有的代码文件格式也会有相同的错误:File.csv。当用文本编辑器打开时,它看起来像在屏幕截图中。当用excel打开时,它看起来像普通的excel文件,每个选项卡都在单独的单元格中(A-date、B-lastname、name、C-Other数据等)。不知道如何检查它?您可以在文本编辑器中打开,复制前10行并粘贴到pastebin吗?或者数据是机密的?