将CSV数据保存到MySQL时使用PHP/fgetcsv时出现问题
实际上,我正在读取一个CSV文件,我尝试使用将CSV数据保存到MySQL时使用PHP/fgetcsv时出现问题,php,mysql,Php,Mysql,实际上,我正在读取一个CSV文件,我尝试使用fgetcsv并使用fopen+fread作为套接字打开。问题是,当它将数据保存到MySQL时,所有数据都会显示,但行和空格会跳转 我还制作了一个MySQLi类来与DB对话 $c = 0; $arreglo = Array(); if (($file = fopen("/pth/to/file/DataParaCortesProgramados.csv", "r")) !== FA
fgetcsv
并使用fopen
+fread
作为套接字打开。问题是,当它将数据保存到MySQL时,所有数据都会显示,但行和空格会跳转
我还制作了一个MySQLi类来与DB对话
$c = 0;
$arreglo = Array();
if (($file = fopen("/pth/to/file/DataParaCortesProgramados.csv", "r")) !== FALSE) {
while (!feof($file)) {
$archivo = fread($file, 100000000);
$linea = explode("\n", $archivo);
$i = 0;
foreach ($linea as $campo) {
$camp = explode(",", $campo, 6);
if ($i > 2) {
$arreglo[$c]["UN"] = $camp[0];
$arreglo[$c]["ncliente"] = $camp[1];
$arreglo[$c]["cliente"] = $camp[2];
$arreglo[$c]["suscrip"] = $camp[3];
$arreglo[$c]["tiposervicio"] = $camp[4];
$arreglo[$c]["datoservicio"] = $camp[5];
$c++;
}
$i++;
}
}
}
foreach ($arreglo as $row){
$ObjDBLink->INSERT("INSERT INTO `SuscripBI_copy` (`UN`,
`ncliente`,
`cliente`,
`suscrip`,
`tiposervicio`,
`datoservicio`) VALUES
('" . $row["UN"] . "',
'" . $row["ncliente"] . "',
'" . $row["cliente"]. "',
'" . $row["suscrip"]. "',
'" . $row["tiposervicio"] . "',
'" . $row["datoservicio"]. "')");
}
===========================================这是FGETCSV===========================
if (($file = fopen("/path/to/file/" . trim($rowf), "r")) !== FALSE) {
while (!feof($file)) {
$reg = fgetcsv($file, 1000, ",");
if ($rowc > 2) {
$clientes[$i]["UN"]=$reg[0];
$clientes[$i]["ncliente"]=$reg[1];
$clientes[$i]["cliente"]=$reg[2];
$clientes[$i]["suscrip"]=$reg[3];
$clientes[$i]["tiposervicio"]=$reg[4];
$clientes[$i]["datoservicio"]=$reg[5];
// var_dump($clientes);
}
$i++;
$rowc++;
}
}
foreach ($clientes as $cliente){
// var_dump($cliente);
$ObjDBLink->INSERT("INSERT INTO `SuscripBI` (`UN`,
`ncliente`,
`cliente`,
`suscrip`,
`tiposervicio`,
`datoservicio`) VALUES
('" . trim($cliente["UN"]," \t\n\r\0\x0B") . "',
'" . trim($cliente["ncliente"]," \t\n\r\0\x0B") . "',
'" . trim($cliente["cliente"]," \t\n\r\0\x0B") . "',
'" . trim($cliente["suscrip"]," \t\n\r\0\x0B") . "',
'" . trim($cliente["tiposervicio"]," \t\n\r\0\x0B") . "',
'" . trim($cliente["datoservicio"]," \t\n\r\0\x0B") . "')");
}
这样,数据会保存到数据库中,但会使用空格或跳行保存
suvch如下所示:
|E m p l E a d o s | 1 3 7|
但我们需要:
|雇员| 1137|
在保存之前,我尝试过修剪($row[“UN”],“\t\n\r\0\x0B”)
,或者使用str\u replace
,但它总是以相同-不正确-的方式保存
================已解决==============
if (($file = fopen("/path/to/file/" . trim($rowf), "r")) !== FALSE) {
while (!feof($file)) {
$reg = fgetcsv($file, 1000, ",");
if ($rowc > 2) {
$clientes[$i]["UN"]=$reg[0];
$clientes[$i]["ncliente"]=$reg[1];
$clientes[$i]["cliente"]=$reg[2];
$clientes[$i]["suscrip"]=$reg[3];
$clientes[$i]["tiposervicio"]=$reg[4];
$clientes[$i]["datoservicio"]=$reg[5];
// var_dump($clientes);
}
$i++;
$rowc++;
}
}
foreach ($clientes as $cliente){
// var_dump($cliente);
$ObjDBLink->INSERT("INSERT INTO `SuscripBI` (`UN`,
`ncliente`,
`cliente`,
`suscrip`,
`tiposervicio`,
`datoservicio`) VALUES
('" . trim($cliente["UN"]," \t\n\r\0\x0B") . "',
'" . trim($cliente["ncliente"]," \t\n\r\0\x0B") . "',
'" . trim($cliente["cliente"]," \t\n\r\0\x0B") . "',
'" . trim($cliente["suscrip"]," \t\n\r\0\x0B") . "',
'" . trim($cliente["tiposervicio"]," \t\n\r\0\x0B") . "',
'" . trim($cliente["datoservicio"]," \t\n\r\0\x0B") . "')");
}
问题是CSV文件的编码,是UTF-16LE,PHP读取UTF-8,为了解决这个问题,我使用shell命令将UTF-16LE改为UTF-8
iconv -f UTF-16LE -t UTF-8 $file > $file2
你能展示CSV的那一行是什么样子的吗?请在插入和更新数据时使用准备好的语句如果它是CSV文件,为什么不使用而不是尝试滚动你自己的文件?请返回使用
fgetcsv
,你目前所做的不是读取CSV数据的正确方法,并且在许多情况下很容易失败。问题本身可能与保存CSV数据的字符编码有关,因此,请先找出哪一个字符。您好,谢谢您的回答,我使用fgetcsv,它的结果是一样的。你能展示CSV的那一行是什么样子吗?请在插入和更新数据时使用准备好的语句。如果它是CSV文件,为什么不使用而不是尝试滚动你自己的文件?请返回使用fgetcsv
,你目前所做的不是读取CSV数据的正确方式,而且在许多情况下很容易失败。问题本身可能与保存CSV数据的字符编码有关,因此,请先找出哪一个是第一个。您好,所有人和thx对于您的答案,我使用fgetcsv,结果相同