Импортирует половину строк дампа

Ailk
Posts: 90
Joined: Fri Mar 28, 2014 8:43 am

Re: Импортирует половину строк дампа

Post by Ailk »

пользуясь случаем хочу предложить использовать стандартные функции парсинга csv строчки.
http://php.net/manual/ru/function.fgetcsv.php
http://php.net/manual/ru/function.str-getcsv.php

Также в ооп стиле
http://php.net/manual/ru/splfileobject.fgetcsv.php
Пример #2 отличнейшая функция парсинга цсв файла в пару гигабайт без потребления памяти.

В данный момент сам мучаюсь с импортом цсв в смарт, т.к. приходится в дампах регулярками вырезать всякие кавычки и экранирущие символы. Неудобно очень.
admin
Site Admin
Posts: 37994
Joined: Wed Sep 10, 2008 11:43 am

Re: Импортирует половину строк дампа

Post by admin »

Конечно пользоваться встроенным намного проще чем писать свое
однако реальность в том, что разные тубы дают в разном виде и юзерам очень сложно объяснить что проблема не в скрипте а в тубе, особенно когда суппорт скрипта отвечает а туба через раз.

пойдем сначала с вашей стороны

какую конкретно вы видите проблему что надо что-то где-то экранировать при импорте ?
Don't forget to run script update
Ailk
Posts: 90
Joined: Fri Mar 28, 2014 8:43 am

Re: Импортирует половину строк дампа

Post by Ailk »

Да никаких особо проблем, за исключением что нужно создавать лишние правила в самом смарте или убирать кавычки и экранирующие символы с дампов, составленных в ручную в екселе например.

Символы обертывания для полей как-бы стандартная штука для цсв. Взять к примеру список категорий, смарт их не распознает, если в дампе будет одна категория с 2 словами в кавычках. Хотя это не противоречит правилам цсв файлов. Также если будет несколько категорий в кавычках.

В целом, на данный момент все работет вроде бы ровно, но это частный случай из возможных вариантов. Добавление в опции парсинга символов обертывания и экранирующих символов при использовании стандартных функций решит проблему (как это сделано в квс или phpmyadmin). А чтобы ничего не сломалось дефолтом просто поставить пустые строки.

П.С.
Если можно, хотел бы узнать адрес туба, дамп которого вызывает трудности в парсинге.
admin
Site Admin
Posts: 37994
Joined: Wed Sep 10, 2008 11:43 am

Re: Импортирует половину строк дампа

Post by admin »

Какой из тубов выдает дамп с назаниями категорий в ковычках ?
И в целом зачем там ковычки ?
Don't forget to run script update
Ailk
Posts: 90
Joined: Fri Mar 28, 2014 8:43 am

Re: Импортирует половину строк дампа

Post by Ailk »

Code: Select all

И в целом зачем там ковычки ?
Не ко мне вопрос, а к экселю, который оборачивает строки с пробелами в кавычки(не эксель один)
В целом, это опциональная штука. Например, чтобы не заканчивать разделителем полей какой-нибудь эмбед код. Оборачиваем в кавычки, экранируем спец символы - вуаля, файл получился абсолютно валидный.

Дабы не ходить вокруг да около, предлагаю сравнить вашу функцию и абсолютно стандартную из пхп (результаты).

Code: Select all

<?php

$csvData = [
    'id' => 60,
    'thumb' => 'http://mysite.com/images/thumb.jpg',
    'categories1' => implode(',', [
        'тут',
        'несколько',
        'категорий',
        'одно_слово',
    ]),
    'categories2' => implode(',', [
        'тут',
        'несколько',
        'категорий',
        'два слова',
    ]),
    'title' => 'Название в несколько слов',
    'desc' => 'описание с апострофом т\'акими словом в "кавычках"',
    'embed_code' => '<iframe src="http://mysite.com/embed/" width="640" height="480"></iframe>',
];

$stream = fopen('php://output' . '', 'w+');
fputcsv($stream, $csvData, '|');

	// тест распознавания на выходе
$string = '60|http://mysite.com/images/thumb.jpg|тут,несколько,категорий,одно_слово|"тут,несколько,категорий,два слова"|"Название в несколько слов"|"описание с апострофом т\'акими словом в ""кавычках"""|"<iframe src=""http://mysite.com/embed/"" width=""640"" height=""480""></iframe>"';

echo '<pre>';
var_dump(str_getcsv($string, '|'));
echo '</pre>';
?>
особенно интересует результат разбора строчки вашей функцией

Code: Select all

60|http://mysite.com/images/thumb.jpg|тут,несколько,категорий,одно_слово|"тут,несколько,категорий,два слова"|"Название в несколько слов"|"описание с апострофом т\'акими словом в ""кавычках"""|"<iframe src=""http://mysite.com/embed/"" width=""640"" height=""480""></iframe>"'
Ailk
Posts: 90
Joined: Fri Mar 28, 2014 8:43 am

Re: Импортирует половину строк дампа

Post by Ailk »

Code: Select all

    // тест распознавания стандартными функциями в варианте csv смарта (без символов обертывания)
$string = '60|http://mysite.com/images/thumb.jpg|тут,несколько,категорий,одно_слово|тут,несколько,категорий,два слова|Название в несколько слов|описание с апострофом т\'акими словом в "кавычках"|<iframe src="http://mysite.com/embed/" width="640" height="480"></iframe>';

echo '<pre>';
var_dump(str_getcsv($string, '|', ''));
echo '</pre>';
Как видим, и такой цсв стандарт понимает:
array(7) {
[0]=>
string(2) "60"
[1]=>
string(34) "http://mysite.com/images/thumb.jpg"
[2]=>
string(64) "тут,несколько,категорий,одно_слово"
[3]=>
string(62) "тут,несколько,категорий,два слова"
[4]=>
string(47) "Название в несколько слов"
[5]=>
string(89) "описание с апострофом т'акими словом в "кавычках""
[6]=>
string(73) "<iframe src="http://mysite.com/embed/" width="640" height="480"></iframe>"
}
admin
Site Admin
Posts: 37994
Joined: Wed Sep 10, 2008 11:43 am

Re: Импортирует половину строк дампа

Post by admin »

В идеальном мире - да
а в реальности дамп выглядит от некоторых тубов так

url|http://thumb_url/|embed code
some more code
code again| description
url2|http://thumb_url2/|embed code22
some more code
code again| description


и никаких ковычек
Don't forget to run script update
Ailk
Posts: 90
Joined: Fri Mar 28, 2014 8:43 am

Re: Импортирует половину строк дампа

Post by Ailk »

это уже не цсв, а какая-то хрень.
Почему бы не подстраивать такие файлы под стандарт, а не стандартные файлы под эту хрень?
В крайнем случае игнорить те тубы, которые говнолепят отсебятину. Нужен будет траф - подстроятся. Нет - идут лесом.

https://ru.wikipedia.org/wiki/CSV
https://en.wikipedia.org/wiki/Comma-separated_values
https://www.ietf.org/rfc/rfc4180.txt
Marmelados
Posts: 20
Joined: Mon Feb 27, 2017 10:18 am

Re: Импортирует половину строк дампа

Post by Marmelados »

Понял :)
Все сработало! Спасибо!
GangstaBros
Posts: 460
Joined: Sun Jan 05, 2014 4:34 pm

Re: Импортирует половину строк дампа

Post by GangstaBros »

Ailk wrote:это уже не цсв, а какая-то хрень.
Почему бы не подстраивать такие файлы под стандарт, а не стандартные файлы под эту хрень?
В крайнем случае игнорить те тубы, которые говнолепят отсебятину. Нужен будет траф - подстроятся. Нет - идут лесом.

https://ru.wikipedia.org/wiki/CSV
https://en.wikipedia.org/wiki/Comma-separated_values
https://www.ietf.org/rfc/rfc4180.txt
кого юзать тогда? :)
открываем хомяка:
https://dl.dropboxusercontent.com/u/576 ... .36.25.png

никакого csv , никаких кавычек )
Post Reply