Добавить данные в файл csv в определенные столбцы с помощью PHP

У меня есть 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

Я был бы очень благодарен любому, кто может направить меня на правильный путь.


person mlclm    schedule 16.02.2015    source источник


Ответы (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);

Теперь у вас есть копия исходного файла со вставленными новыми значениями.

person kellanburket    schedule 16.02.2015
comment
Спасибо большое за вашу помощь. Я понял идею. Я понятия не имею, как вернуть значения в CSV. Вот мой код: pastebin.com/v1QQpaSv - person mlclm; 17.02.2015
comment
Спасибо, однако у меня все еще есть проблемы, возможно, я делаю что-то не так, потому что получаю сообщение об ошибке: Предупреждение: array_combine() ожидает, что параметр 2 будет массивом, заданным логическим значением - person mlclm; 17.02.2015
comment
Возможно, ваши CSV-файлы имеют проблему с кодировкой. Сделай мне одолжение и иди к терминалу. Найдите каталог, в котором хранится ваш файл, и запустите file file.csv, где «file.csv» — это имя вашего файла. Опубликуйте вывод здесь. - person kellanburket; 17.02.2015
comment
Спасибо за ответ. наконец-то сработало! Было несколько проблем. Вы были правы, когда я проверил в блокноте ++, он был в ANSI, я закодировал его в UTF-8. Также $data['sku'] выдала следующую ошибку: Неопределенный индекс: sku, я изменил на $row['sku'] . Новый файл csv создается с правильными данными внутри. Большое спасибо за ваш подробный ответ и последующие действия, очень признателен, я хотел бы отправить вам несколько долларов через PayPal, чтобы поблагодарить вас, потому что вы действительно помогли мне здесь, вы можете отправить мне письмо на mlclm (точка ) design (at) gmail (dot) com, чтобы сообщить мне ваш адрес PayPal - person mlclm; 17.02.2015
comment
хотя я ценю ваше предложение, я более чем счастлив помочь бесплатно :) - person kellanburket; 18.02.2015