CSV 文件格式
CSV file formatting
我有问题:我需要能够使用 PHP 将 CSV 文件导入 MS Access 数据库。我有一个脚本可以做到这一点,但我的 CSV 文件格式不正确。
原格式为:
但是脚本使用这种格式:
两个文件都是.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);
}
"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++;
}
我有问题:我需要能够使用 PHP 将 CSV 文件导入 MS Access 数据库。我有一个脚本可以做到这一点,但我的 CSV 文件格式不正确。
原格式为:
但是脚本使用这种格式:
两个文件都是.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);
}
"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++;
}