【问题标题】:Add data to csv file in specific columns using PHP使用 PHP 将数据添加到特定列中的 csv 文件
【发布时间】:2015-02-16 21:38:06
【问题描述】:

我有一个 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。例如,如果第一行的sku 列有sku01,则同一行的图像列中的文件名将是sku01.jpeg。 small_image 值和缩略图值也是如此。

但是,只有当 jpeg 存在于文件夹中时,才会指定文件名。

到目前为止,我知道如何使用 fopen 函数打开 csv 文件,最终将所有数据存储在一个数组中(我不知道这对我的情况是否有帮助),然后在某些时候使用 fputcsv 函数检查服务器上特定文件夹中是否存在 file_exist。

但是,就我应该以什么顺序使用这些功能而言,我的脑海中仍然是一团糟。我卡住了。另外,我不知道如何将 jpeg 文件名放在正确的列(图像、缩略图、small_image)中,因为这些列位于 csv 文件的“中间”以及其他列中。它们不在 csv 文件的末尾

我会非常感谢任何能让我走上正确道路的人。

【问题讨论】:

    标签: php database csv fputcsv


    【解决方案1】:

    要做你想做的事,你应该首先把你的列分解成一个数组,就像它们在你的原始 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);
    

    现在您有了原始文件的副本,其中插入了新值。

    【讨论】:

    • 非常感谢您的帮助。我明白了。我不知道如何将值放回 CSV。这是我的代码:pastebin.com/v1QQpaSv
    • 谢谢,但是我仍然有问题,我可能做错了,因为我收到一个错误:警告:array_combine() 期望参数 2 是数组,给定的布尔值
    • 您的 csv 文件可能存在编码问题。帮我一个忙,然后转到终端。找到存储文件的目录并运行file file.csv,其中“file.csv”是文件的名称。在此处发布输出。
    • 感谢您的回复。它终于奏效了!有几个问题。你是对的,当我在记事本++中检查它是 ANSI 时,我用 UTF-8 编码它。另外 $data['sku'] 给出了以下错误: Undefined index: sku ,我改为 $row['sku'] 。创建新的 csv 文件,其中包含正确的数据。非常感谢您的详细回复和跟进,非常感谢,我想通过 paypal 向您发送几美元以感谢您,因为您在这里真的帮助了我,您可以在 mlclm 上给我发邮件(点) 设计 (at) gmail (dot) com 让我知道您的贝宝地址
    • 感谢您的提议,但我很乐意免费提供帮助 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 2022-01-14
    • 2018-11-29
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多