使用 PHP 将数据添加到特定列中的 csv 文件
Add data to csv file in specific columns using PHP
我有一个包含 14 列和数百行的 csv 文件。有一个 header 即 "sku","category","description","brand"
等等
所有数据都已准备就绪,但我正在尝试在 CSV 中的某些特定列中添加一些图像文件名 ( "images", "small_image" , "thumnail" ).
header 看起来像这样:
+-----+----------+-------------+-------+-------------+-----------+--------+------+
| sku | category | description | image | small_image | thumbnail | price | color|
+-----+----------+-------------+-------+-------------+-----------+--------+------+
知道 header 的样子,那么第一行就是:
+-------+---------------+------------------+---+---+----+-----+--------+
| sku01 | category name | description here | | | | 99$ | black |
+-------+---------------+------------------+---+---+----+-----+--------+
jpeg 的文件名与同一行的 sku
值相同,扩展名为 jpeg。因此,例如,如果第一行的 sku
列有 sku01
,则同一行的图像列中的文件名将是 sku01.jpeg
。 small_image 值和缩略图值也是如此。
但是,只有在文件夹中存在 jpeg 时才会指定文件名。
到目前为止我知道如何使用 fopen 函数打开 csv 文件,最终将所有数据存储在一个数组中(我不知道这对我的情况是否有帮助),然后在某些时候使用 fputcsv检查服务器上特定文件夹中是否有 file_exist 后运行。
但是,对于我来说,我应该按照什么顺序使用函数,这仍然是我脑子里的一个大问题。我卡住了。另外,我不知道如何将 jpeg 文件名放在正确的列中(图像、缩略图、small_image),因为这些列在 csv 文件的 "middle" 中,还有其他列。它们不在 csv 文件的末尾
我真的很感谢任何能让我走上正确道路的人。
要完成您想做的事情,您应该首先将列完全按照原始 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);
现在您拥有插入了新值的原始文件的副本。
我有一个包含 14 列和数百行的 csv 文件。有一个 header 即 "sku","category","description","brand"
等等
所有数据都已准备就绪,但我正在尝试在 CSV 中的某些特定列中添加一些图像文件名 ( "images", "small_image" , "thumnail" ).
header 看起来像这样:
+-----+----------+-------------+-------+-------------+-----------+--------+------+
| sku | category | description | image | small_image | thumbnail | price | color|
+-----+----------+-------------+-------+-------------+-----------+--------+------+
知道 header 的样子,那么第一行就是:
+-------+---------------+------------------+---+---+----+-----+--------+
| sku01 | category name | description here | | | | 99$ | black |
+-------+---------------+------------------+---+---+----+-----+--------+
jpeg 的文件名与同一行的 sku
值相同,扩展名为 jpeg。因此,例如,如果第一行的 sku
列有 sku01
,则同一行的图像列中的文件名将是 sku01.jpeg
。 small_image 值和缩略图值也是如此。
但是,只有在文件夹中存在 jpeg 时才会指定文件名。
到目前为止我知道如何使用 fopen 函数打开 csv 文件,最终将所有数据存储在一个数组中(我不知道这对我的情况是否有帮助),然后在某些时候使用 fputcsv检查服务器上特定文件夹中是否有 file_exist 后运行。
但是,对于我来说,我应该按照什么顺序使用函数,这仍然是我脑子里的一个大问题。我卡住了。另外,我不知道如何将 jpeg 文件名放在正确的列中(图像、缩略图、small_image),因为这些列在 csv 文件的 "middle" 中,还有其他列。它们不在 csv 文件的末尾
我真的很感谢任何能让我走上正确道路的人。
要完成您想做的事情,您应该首先将列完全按照原始 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);
现在您拥有插入了新值的原始文件的副本。