battrack
@battrack

Клиент хочет автоматизировать загрузку каталога на сайт через CSV, как это сделать если есть сложные описания?

Суть вопроса вот в чем. Клиент хочет автоматизировать загрузку товаров на сайт из CSV файла. На первый взгляд проблем нет - разделить все поля точкой с запятой и все. Но как быть с полем "описание", которое может содержать очень много текста, html-теги, знаки препинания (та же точка с запятой) и т.д.?
Уточню, что вопрос касается не столько обработки на стороне сайта, сколько того КАКИМ образом предложить клиенту готовить этот файл, чтобы в нем в итоге оказались экранированы специальные символы. Ведь не может же он просто в экселе создать табличку, навбивать туда текстов и сохранить в CSV.
И еще он хочет чтобы в тексте были html-теги. На сайте есть визуальный редактор, в котором форматируешь текст и он добавляет нужные теги, но если клиент будет готовить тексты вне файла, как ему сделать, чтобы текст был уже с html?
  • Вопрос задан
  • 424 просмотра
Решения вопроса 3
DevMan
@DevMan
есть полно готовых либ для работы с cvs.
есть даже встроенная функция.
Ответ написан
@nirvimel
Вот qwerty.csv с длинными строками, разметкой, тегами и кавычками. Приготовлен он в LibreOffice Calk (пусть будет Excel). При сохранении заданны параметры: "разделитель полей": ,, "разделитель текста": ", "выделять кавычками все текстовые ячейки".
1,"Тайтл","<h1 itemprop=""name "" class=""question__title"">
  Клиент хочет автоматизировать загрузку каталога на сайт через CSV, как это сделать если есть сложные описания?</h1>"
2,"Теги","<ul class=""tags-list"">
              <li class=""tags-list__item subscribed tag_158794"">
          <a href=""https://toster.ru/tag/csv"">
            Csv          </a>
        </li>
                    <li class=""tags-list__item subscribed tag_152707"">
          <a href=""https://toster.ru/tag/программирование"">
            Программирование          </a>
        </li>
                    <li class=""tags-list__item  tag_260"">
          <a href=""https://toster.ru/tag/php"">
            PHP          </a>
        </li>
                </ul>"

Вот скрипт на Python (извините, PHP на сегодня закончился), который выводит в консоль содержимое qwerty.csv построчно, раздельно все поля (№, Name, Description).
import csv
with open('qwerty.csv', 'rb') as csvfile:
    for row in csv.reader(csvfile, delimiter=r',', quotechar=r'"'):
        print ("# %s\nName: %s\nDescription: %s\n" % tuple(row))

Как видите все обрабатывается корректно, включая большие куски HTML, никакие строки и поля не смешиваются:
# 1
Name: Тайтл
Description: <h1 itemprop="name " class="question__title">
  Клиент хочет автоматизировать загрузку каталога на сайт через CSV, как это сделать если есть сложные описания?</h1>
# 2
Name: Теги
Description: <ul class="tags-list">
              <li class="tags-list__item subscribed tag_158794">
          <a href="https://toster.ru/tag/csv">
            Csv          </a>
        </li>
                    <li class="tags-list__item subscribed tag_152707">
          <a href="https://toster.ru/tag/программирование">
            Программирование          </a>
        </li>
                    <li class="tags-list__item  tag_260">
          <a href="https://toster.ru/tag/php">
            PHP          </a>
        </li>
                </ul>
Ответ написан
Комментировать
@abcd0x00
Надо просто использовать готовые средства для преобразования данных в csv, потому что они знают, как правильно экранировать (соотвествуют rfc4180).
На питоне пример
>>> import csv
>>> import sys
>>> 
>>> lst = [['a a1', 'b,b1', '<c>"text"</c>1', 'd d1'],
...        ['a a2', 'b,b2', '<c>"text"</c>2', 'd d2'],
...        ['a a3', 'b,b3', '<c>"text"</c>3', 'd d3']]
>>> 
>>> writer = csv.writer(sys.stdout)
>>> 
>>> writer.writerows(lst)
a a1,"b,b1","<c>""text""</c>1",d d1
a a2,"b,b2","<c>""text""</c>2",d d2
a a3,"b,b3","<c>""text""</c>3",d d3
>>>

Ответ написан
Пригласить эксперта
Ответы на вопрос 1
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
Текст поля не может содержать разделитель, так что точки с запятой в вашем описании не будет, либо будет заэскейпена и функция чтения csv это поймёт.
И что значит "как быть"? Как вам надо, так и будьте. Нужно просто запихнуть его в базу - запихивайте как есть. Нужно оставить только текст - фильтруйте и оставляйте только текст. В чём суть вопроса то?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы