读取CSV文件后存入数据库,会多出很多条空记录

ff_yx 2010-01-05 04:53:57
$file = fopen("1.csv","r");

$title=array();
$data=array();
$i=0;
while(!feof($file))
{
if($i==1)
{
$content=fgetcsv($file);
for($j=0;$j<count($title);$j++)
{
$key=$title[$j];
$value=$content[$j];
$data[$key]=$value;
}
//此处省略掉将数组$data内数据写入数据库的语句。
}
else
{
$title=fgetcsv($file);
$i=1;
}

}
fclose($file);
...全文
511 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
转换下CSV为UTF-8编码格式试下!
brilliant_fgh 2010-01-06
  • 打赏
  • 举报
回复
把CSV转换成UTF-8格式的,或者将CSV导到Access里,再连接到Access读取插入!
ff_yx 2010-01-06
  • 打赏
  • 举报
回复
多谢9楼的代码,

又看到了这样一种写法,同8楼朋友的思路,比我那个好多了

while(!feof($handle_csv)) {
$fields = fgetcsv($handle_csv, 1024);
if($fields === false){
break;
}
if($fields[0] === ""){
continue;
}
$data[] = $fields;
xuzuning 2010-01-06
  • 打赏
  • 举报
回复
不必那么麻烦

while($buf = fgetcsv($fp)) {
if(trim(join('',$buf))) {
这里是正常的入库操作
}
}
wenq0917 2010-01-06
  • 打赏
  • 举报
回复
也可以边读边判断啊,不满足条件的时候直接跳过就行了
ff_yx 2010-01-06
  • 打赏
  • 举报
回复
还没有验证转换UTF-8是否可以,我解决的办法是把数组遍历一遍,把所有空记录unset()掉了。

现把我的思路写下大家交流下

算法可能比较糟糕,是先把所有数据都放到一个二维数组里面,然后遍历这个二维数组的。循环里面嵌套了一层循环(写数据库的时候是读一行CSV写一行入数据库的,没有放到一个二维数组里,不过思路是大同小异的)。不过目前我的水平仅限于想到这个可行方法,呵呵。

相应代码:

$k=-1;
$titlekey='';

...省略掉读取文件给$data赋值的语句,这里给$titlekey赋值,内容是任意的一个‘key’

$count=count($data[$titlekey]);//任取一列进行分析,

for($j=0;$j<$count;$j++)
{
if($data[$titlekey][$j]=='') //如果某列中有空值,将该空值对应的key记录到$k中
{
$k=$j;
}
if($k!=-1)
{
for($j1=0;$j1<count($title);$j1++)
{
$key=$title[$j1];
if($data[$key][$k]!='')
{
$k=-1;
}
}
if($k!=-1)//如果每一列的该行都为空,就把这一行所有的信息从对应的数组项中删掉
{
for($j1=0;$j1<count($title);$j1++)
{
$key=$title[$j1];
unset($data[$key][$k]);
}
}
}
}
jaxio 2010-01-05
  • 打赏
  • 举报
回复
得到数据var_dump(trim())化空格。。
骄傲青蛙 2010-01-05
  • 打赏
  • 举报
回复
将csv读进一个数据, 过滤一下, 以免不必要的的东西也混进数据库就不好
yunfeifan 2010-01-05
  • 打赏
  • 举报
回复
你的csv多了一行空记录,看看吧最后一行的回车去掉
ff_yx 2010-01-05
  • 打赏
  • 举报
回复
用这段代码读取CSV后面会多一条空记录,应该是多循环了一次,请问哪里出错误了
DataBaseTool: 简单的数据库查询、修改工具。 最新版本: 1.0.0.7 20190616 如不能正常执行,请运行 Regist.bat 注册必要的组件。 (在win7下可能由于权限的问题无法复制和注册文件到系统目录,解决方法是: 打开‘开始’菜单->‘所有程序’->‘附件’,右键点击‘命令提示符’,选择‘以管理员身份运行’, 启动命令行程序后,转到本程序目录,然后执行Regist.bat) 本程序可用的数据库可以是Access的.mdb文件,.xls文件,.csv文件,.txt文件等 也可用于打开SQL Server数据库和已建立ODBC数据源的其他数据库 若要打开mdb文件、xls文件csv文件、txt文件,可以点“Browse”按钮定位文件,也可以直接把文件拖到MdbFile列表框中。 若要打开SQLServer数据库,则需要在MdbFile输入框中输入“sql:ServerName,DataBaseName,UserName,Password”, 其中 ServerName 是数据库服务器的名称或IP地址 DataBaseName 是数据库名称 UserName 是用户名称 Password 是用户密码 若要连接其他数据库,可以直接输入数据源的名称(DSN),格式为:“dsn:数据源的名称;uid=用户名;pwd=密码” Field1 和 Field2 是查询条件,所选表格的字段已列出,点选字段名、比较运算符,然后在后面输入条件 支持最多两个查询条件,如果需要更多查询条件或者构造更复杂的条件,请点击 “ExeSQL” 按钮,在那里可以自己输入任何合法的 SQL 命令,程序将帮您执行它! FieldToReplace 及下面两个输入框是用来把数据表中某一个字段中的特定字符串替换为其他字符串: StrTobeReplace 是需要被替换掉的字符串,StrToReplace 是用来替换的字符串! (不要奇怪为什么提供如此奇怪的功能!是因为工作需要替换某个表中所有记录的某个字段的指定字符串,才写了这个程序,就是说这个功能是写这个程序的初衷!) 如果点选 Order 复选框,则按照 Field1, Field2, FieldToReplace 的顺序排序,如果 Field1 或者 Field2 已经是 查询条件的一部分,则不参与排序。 如果点选 AutoUpdate 复选框,则在下面表格中修改的数据自动更新到数据库中,如果仅修改一个单元格的数据,则修改完后需要按回车键确定才存入数据库! 如果没有点选 AutoUpdate 复选框,并在表格中修改了数据,按“UpDate”按钮也可以把修改的数据更新到数据库中(这个不太常用!) 右侧的字段列表是查询时需要显示的列,如果一个也不选或者全选,则都将查询所有字段(即select *) 【常用的】 EXESQL 按钮: 可以直接输入一个简单的SQL命令并执行。 ‘Show queried data’ 选项: 指示所输入的 sql 命令是否返回数据集,如果勾选,程序尝试读取返回的数据集,如果不勾选,程序就只是执行命令并尝试返回受影响的行数。 程序自动判断这个命令是否返回数据集,如果判断为返回数据集,比如输入的是一个 类似 select * from 的命令,则自动勾选‘Show queried data’。如果您确定命令返回数据集但这个选项没有自动勾选,您可以手动勾选, 这样程序就尝试读取并显示得到的结果。 ‘LongSQL’按钮: 如果您想要输入一个很长很复杂的命令,可以再按‘LongSQL’按钮,弹出一个可以输入多行文字的新输入窗口,然后就可以在其中输入多行命令。 换行: 在这个输入控件中,直接按回车就是换行,如果按 Ctrl+回车 则相当于按‘OK’按钮,立即执行输入的命令。 多个命令: 如果想要一次执行多个命令,比如几百几千行的 insert 命令,可以一次把所有这些命令都复制到 LongSQL 的输入框中, 每一命令之间用英文分号';'分隔,然后按 Ctrl+回车 或点击‘OK’按钮执行。 ‘Ignore errors’选项: 如果输入的多行命令可能有些出错,比如 insert 了重复的数据,并且希望除出错的命令外其他的命令可以正常执行,可以选中这个选项, 这样的话,程序跳过出错的命令并继续执行后面的命令。 数据导出: ‘Export’按钮: 如果想要导出查询或命令的结果,可以在结果显示出来后,按‘Export’按钮,程序自动启动Excel并把数据导出到Excel中;如果电脑上没有 安装Excel,则这个按钮不起作用。 复制数据: 用户可以选择把数据复制到剪贴板上,复制有2种方式: 1) 复制所选行 按住 Ctrl 键并用鼠标点击每行的行首,可以选择多行(所选择的行并不要求相邻),选择完毕后,在所选行上点击鼠标右键选择 ‘Copy’菜单进行复制。 2) 复制所选列 点击需要复制的第一列的列标题,然后按住‘Shift’键再点击需要复制的最后一列的列标题(按列复制时要求这些列必须相邻), 选择完毕后,在所选行上点击鼠标右键选择‘Copy’菜单进行复制。 ‘Copy’菜单有2个,一个是 ‘Copy(Using Tab)’,另一个是‘Copy(Using ',')’, 如果选择‘Copy(Using Tab)’则复制的数据中,各字段值之间用 Tab 分隔, 如果选择‘Copy(Using ',')’则复制的数据中,各字段值之间用英文的逗号分隔。 ================================================================================== 特别的命令: 如果想查看每个表格中各有多少数据,可以执行: SELECT $TABLEINFO$ 如果想查看某个表格的字段定义,可以执行: SELECT $FIELDINFO$ where table=TableName,其中‘TableName’是您想查看的表格的名称 ================================================================================== 这个程序可以作为临时或不想打开庞大的数据库软件时查看或修改数据的小工具,也可以作为验证sql是否正确的工具! 或者通过在界面上点选查询条件,按 “Find” 按钮,然后再按 “ExeSQL” 按钮,然后把自动生成的sql命令复制出来用到其他地方,即把这个程序作为简便的生成sql命令的工具. win7 或 win10系统下,需要以管理员身份运行 Regist.bat 以注册所需的组件。

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧