我有一个csv文件,它有14列,数百行。有一个标题是"sku","category","description","brand"
等。
所有数据都已存在,但我尝试在CSV中添加一些图像文件名,在某些特定列中( "images", "small_image" , "thumnail" ).
标题类似于:
+-----+----------+-------------+-------+-------------+-----------+--------+------+
| sku | category | description | image | small_image | thumbnail | price | color|
+-----+----------+-------------+-------+-------------+-----------+--------+------+
所以知道标题的样子,然后第一行就像:
+-------+---------------+------------------+---+---+----+-----+--------+
| sku01 | category name | description here | | | | 99$ | black |
+-------+---------------+------------------+---+---+----+-----+--------+
jpeg的文件名与同一行的sku
值相同,并带有jpeg扩展名。例如,如果第一行的sku01
列有sku
,则同一行的图像列中的文件名为sku01.jpeg
。那么将是small_image值和缩略图值。
但是,如果jpeg存在于文件夹中,则只会指定文件名。
到目前为止,我知道如何使用fopen函数打开csv文件,最终将所有数据存储在一个数组中(我不知道这对我的情况是否有帮助),然后在某些时候使用fputcsv检查服务器上的特定文件夹中是否存在file_exist后的函数。
但是,对我来说,就我应该使用这些功能的顺序而言,我脑子里还是一团糟。我被卡住了。此外,我不知道如何将jpeg文件名放在右列(图像,缩略图,small_image)中,因为这些列位于"中间"其他列中的csv文件。它们不在csv文件的末尾
我真的很感谢能够让我走上正确道路的人。
答案 0 :(得分:5)
要执行您想要执行的操作,您应该首先将列拆分为与原始csv文件中显示的完全相同的数组:
$columns = ["sku","category","description","image","small_image","thumbnail", "price","color"];
然后,您将要打开文件并对其进行迭代,构建键值对的关联数组,检查该图像名称是否存在文件,如果存在,则指定正确的名称数组。
$rootDir = ""; //Root directory where your image files are located
$file = fopen("filehandle.csv", "r"); //Open the old file for reading
$newFile = fopen("newfilehandle.csv", "w"); //Create a new file for writing
while (($data = fgetcsv($file)) !== FALSE) {
$row = array_combine($columns, $data);
$filename = "{$row['sku']}.jpeg";
if (file_exists("$rootDir/$filename")) {
$row['image'] = $filename;
$row['small_image'] = $filename;
$row['thumbnail'] = $filename;
}
fputcsv($newFile, array_values($row)); //write data into new file
}
fclose($file);
fclose($newFile);
现在您已经插入了新值的原始文件的副本。