PHP如何将导入器字段映射到csv第一行字段?
我正在将rims从csv文件导入webshop项目。没有什么可卖的,只是一个学习进口商如何工作的个人项目。 我正在尝试将$EANColumn变量映射到csv中的第一行字段名 因此,目前我有一个包含以下字段的csv: EAN;品牌;。。。还有更多的承诺PHP如何将导入器字段映射到csv第一行字段?,php,data-import,Php,Data Import,我正在将rims从csv文件导入webshop项目。没有什么可卖的,只是一个学习进口商如何工作的个人项目。 我正在尝试将$EANColumn变量映射到csv中的第一行字段名 因此,目前我有一个包含以下字段的csv: EAN;品牌;。。。还有更多的承诺 1234-WB;WheelBrand…还有更多承诺 5678-BW;BrandWheel…还有更多 目前,在我的导入程序中,当我映射以下内容时,它会起作用: $EANColumn = str_replace('’', '', $imp
1234-WB;WheelBrand…还有更多承诺
5678-BW;BrandWheel…还有更多
目前,在我的导入程序中,当我映射以下内容时,它会起作用:
$EANColumn = str_replace('’', '', $importData_arr["EAN"]);
并通过数组将其插入我的数据库:
foreach($importData_arr as $importData){
// var_dump($importData);
$insertData = array(
"EAN" =>$EANColumn);
RimsUpload::insertData($insertData);
这部分的完整代码如下:
if ($request->input('submit') != null ){
$file = $request->file('file');
// File Details
$filename = $file->getClientOriginalName();
$extension = $file->getClientOriginalExtension();
$tempPath = $file->getRealPath();
$fileSize = $file->getSize();
$mimeType = $file->getMimeType();
// Valid File Extensions
$valid_extension = array("csv");
// 2MB in Bytes
$maxFileSize = 2097152;
// Check file extension
if(in_array(strtolower($extension),$valid_extension)){
// Check file size
if($fileSize <= $maxFileSize){
// File upload location
$location = 'uploads';
// Upload file
$file->move($location,$filename);
// Import CSV to Database
$filepath = url($location."/".$filename);
// Reading file
$file = fopen($filepath,"r");
$importData_arr = array();
$i = 0;
while (($filedata = fgetcsv($file, 1000, ";")) !== FALSE) {
$num = count($filedata );
$EANColumn = str_replace('’', '', $importData_arr["EAN"]);
$BrandColumn = $importData_arr["Brand"];
// Skip first row (Remove below comment if you want to skip the first row)
if($i == 0){
$i++;
continue;
}
for ($c=0; $c < $num; $c++) {
$importData_arr[$i][] = $filedata [$c];
}
$i++;
}
fclose($file);
dump($importData_arr);
// Insert to MySQL database
foreach($importData_arr as $importData){
// var_dump($importData);
$insertData = array(
"EAN" =>$EANColumn,
"Brand"=>$BrandColumn,
"Name"=>$importData[2],
"Size"=>$importData[3],
"PCD"=>$importData[4],
"Offset"=>$importData[5],
"Bore"=>$importData[6],
"Color"=>$importData[7],
"Price"=>$importData[8],
"Stock"=>$importData[9],
"ImageURL"=>$importData[10]);
RimsUpload::insertData($insertData);
}
Session::flash('message','Import Successful.');
}else{
Session::flash('message','File too large. File must be less than 2MB.');
}
}else{
Session::flash('message','Invalid File Extension.');
}
}
// Redirect to index
// return redirect()->action("RimsUploadController@index", [$request]);
return response()->redirectToAction('App\Http\Controllers\RimsUploadController@index', [$request]);
}
if($request->input('submit')!=null){
$file=$request->file('file');
//文件详细信息
$filename=$file->getClientOriginalName();
$extension=$file->getClientOriginalExtension();
$tempPath=$file->getRealPath();
$fileSize=$file->getSize();
$mimeType=$file->getMimeType();
//有效的文件扩展名
$valid_extension=数组(“csv”);
//2MB字节
$maxFileSize=2097152;
//检查文件扩展名
if(在数组中(strtolower($extension),$valid_extension)){
//检查文件大小
如果($fileSize-move($location,$filename);
//将CSV导入数据库
$filepath=url($location.“/”$filename);
//读取文件
$file=fopen($filepath,“r”);
$importData_arr=array();
$i=0;
while(($filedata=fgetcsv($file,1000,“;”))!==FALSE){
$num=计数($filedata);
$EANColumn=str_replace(“”,“”,$importData_arr[“EAN”);
$BrandColumn=$importData_arr[“品牌”];
//跳过第一行(如果要跳过第一行,请删除下面的注释)
如果($i==0){
$i++;
继续;
}
对于($c=0;$c<$num;$c++){
$importData_arr[$i][=$filedata[$c];
}
$i++;
}
fclose($文件);
转储($importData_arr);
//插入到MySQL数据库
foreach($importData\u arr as$importData){
//变量转储($importData);
$insertData=数组(
“EAN”=>$EAN列,
“品牌”=>$BrandColumn,
“Name”=>$importData[2],
“大小”=>$importData[3],
“PCD”=>$importData[4],
“偏移量”=>$importData[5],
“孔”=>$importData[6],
“颜色”=>$importData[7],
“价格”=>$importData[8],
“库存”=>$importData[9],
“ImageURL”=>$importData[10]);
RimsUpload::insertData($insertData);
}
会话::flash('消息','导入成功');
}否则{
会话::闪存(“消息”,“文件太大。文件必须小于2MB”);
}
}否则{
会话::flash('消息','文件扩展名无效');
}
}
//重定向到索引
//返回重定向()->操作(“RimsUploadController@index“,[$请求];
return response()->redirectToAction('App\Http\Controllers\RimsUploadController@index“,[$request]);
}
但真正的问题是我不想映射像[0]、[1]、[2]、[3]这样的列。。。
我想从第一排列的名称中选取它们:[“EAN”],[“Brand”],[“name”],[“Size”]。。。
所以,如果EAN是第1列或第7列,它不会有什么区别,因为它将通过名称而不是行号来检测它。
因此,它将能够处理具有不同列顺序的文件
尝试执行此操作时,我得到错误:
未定义索引:EAN on$EANColumn=str_replace(“”,“”,$importData_arr[“EAN”);
整个要点是通过csv将供应商的数据导入mysql,然后将其显示到webshop站点。下面是一些简单的建议,如何将数据映射到具有给定密钥的数组
while ($row = fgetcsv($fp, 100, ',')) {
$columnName = ['a','b','c','d','e','f'];
$myRow = array_combine($columnName,$row);
....
在while循环之前,从csv的第一行提取字段名:
$file = fopen($filepath,"r");
$keys = fgetcsv($file, 1000, ';');
然后,获取数据行并将$keys
数组与数据组合成关联数组:
$importData_arr = [];
while ($line = fgetcsv($file, 1000, ';')) {
$data = array_combine($keys, $line);
// Do something with the data
$data['EAN'] = str_replace('’', '', $data['EAN']);
$importData_arr[] = $data;
}
fclose($file);
现在,您可以按名称访问所有数据字段,而不受CSV中顺序的影响:
foreach($importData_arr as $importData){
echo $importData['EAN'];
}
只要字段名保持不变,当字段顺序或计数发生变化时,您就不必更改导入代码。在输入数据中,它不是数字索引键吗?您可以将$importData\u arr转储吗?只需创建一个映射器类,在该类中您可以将行映射到其相关名称,您还可以应用一些出于您的目的(myMapperClass->getValuesByBrandName(mybrandname)或任何您想要的东西)需要Logic。@Jerson数组(0){@ChristianFelix我不知道你这是什么意思,你能告诉我吗?即使在一个类中做了我所做的事情。它仍然会返回未定义索引的错误当你不打算应用特殊逻辑时,只使用这个:$test=['a','b','c','d','e','f'];$result=array\u combine($test,$row);现在您的数组有一个与value@Michael阿格霍姆:我的第一稿有一个bug,已经修复了!为什么我还需要定义偏移量“$importData_arr[0]”还有。这是一个非常好的解决方案,我添加了这个。一切似乎都很好,但我得到了错误:未定义的偏移量:8。添加10列时。我已仔细检查,没有错误,但不会高于7。有什么想法吗?@Michael Aggerholm:在我的第一个示例中,我跳过了
foreach
,因此必须为ac指定偏移量访问一个元素-查看我的更新答案,在代码中使用foreach
类循环。@Michael Aggerholm:要解决第二个问题,只需通过var_dump
”逐行调试fgetcsv
,CSV文件中可能存在某种错误