Page 2 of 3
Re: Импортирует половину строк дампа
Posted: Tue Feb 28, 2017 9:13 am
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 отличнейшая функция парсинга цсв файла в пару гигабайт без потребления памяти.
В данный момент сам мучаюсь с импортом цсв в смарт, т.к. приходится в дампах регулярками вырезать всякие кавычки и экранирущие символы. Неудобно очень.
Re: Импортирует половину строк дампа
Posted: Tue Feb 28, 2017 9:44 am
by admin
Конечно пользоваться встроенным намного проще чем писать свое
однако реальность в том, что разные тубы дают в разном виде и юзерам очень сложно объяснить что проблема не в скрипте а в тубе, особенно когда суппорт скрипта отвечает а туба через раз.
пойдем сначала с вашей стороны
какую конкретно вы видите проблему что надо что-то где-то экранировать при импорте ?
Re: Импортирует половину строк дампа
Posted: Tue Feb 28, 2017 10:17 am
by Ailk
Да никаких особо проблем, за исключением что нужно создавать лишние правила в самом смарте или убирать кавычки и экранирующие символы с дампов, составленных в ручную в екселе например.
Символы обертывания для полей как-бы стандартная штука для цсв. Взять к примеру список категорий, смарт их не распознает, если в дампе будет одна категория с 2 словами в кавычках. Хотя это не противоречит правилам цсв файлов. Также если будет несколько категорий в кавычках.
В целом, на данный момент все работет вроде бы ровно, но это частный случай из возможных вариантов. Добавление в опции парсинга символов обертывания и экранирующих символов при использовании стандартных функций решит проблему (как это сделано в квс или phpmyadmin). А чтобы ничего не сломалось дефолтом просто поставить пустые строки.
П.С.
Если можно, хотел бы узнать адрес туба, дамп которого вызывает трудности в парсинге.
Re: Импортирует половину строк дампа
Posted: Tue Feb 28, 2017 10:24 am
by admin
Какой из тубов выдает дамп с назаниями категорий в ковычках ?
И в целом зачем там ковычки ?
Re: Импортирует половину строк дампа
Posted: Tue Feb 28, 2017 11:15 am
by Ailk
Не ко мне вопрос, а к экселю, который оборачивает строки с пробелами в кавычки(не эксель один)
В целом, это опциональная штука. Например, чтобы не заканчивать разделителем полей какой-нибудь эмбед код. Оборачиваем в кавычки, экранируем спец символы - вуаля, файл получился абсолютно валидный.
Дабы не ходить вокруг да около, предлагаю сравнить вашу функцию и абсолютно стандартную из пхп (результаты).
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>"'
Re: Импортирует половину строк дампа
Posted: Tue Feb 28, 2017 11:20 am
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>"
}
Re: Импортирует половину строк дампа
Posted: Tue Feb 28, 2017 1:43 pm
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
и никаких ковычек
Re: Импортирует половину строк дампа
Posted: Tue Feb 28, 2017 2:13 pm
by Ailk
это уже не цсв, а какая-то хрень.
Почему бы не подстраивать такие файлы под стандарт, а не стандартные файлы под эту хрень?
В крайнем случае игнорить те тубы, которые говнолепят отсебятину. Нужен будет траф - подстроятся. Нет - идут лесом.
https://ru.wikipedia.org/wiki/CSV
https://en.wikipedia.org/wiki/Comma-separated_values
https://www.ietf.org/rfc/rfc4180.txt
Re: Импортирует половину строк дампа
Posted: Tue Feb 28, 2017 2:29 pm
by Marmelados
Понял

Все сработало! Спасибо!
Re: Импортирует половину строк дампа
Posted: Tue Feb 28, 2017 5:38 pm
by GangstaBros
кого юзать тогда?

открываем хомяка:
https://dl.dropboxusercontent.com/u/576 ... .36.25.png
никакого csv , никаких кавычек )