пользуясь случаем хочу предложить использовать стандартные функции парсинга 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: Импортирует половину строк дампа
Конечно пользоваться встроенным намного проще чем писать свое
однако реальность в том, что разные тубы дают в разном виде и юзерам очень сложно объяснить что проблема не в скрипте а в тубе, особенно когда суппорт скрипта отвечает а туба через раз.
пойдем сначала с вашей стороны
какую конкретно вы видите проблему что надо что-то где-то экранировать при импорте ?
однако реальность в том, что разные тубы дают в разном виде и юзерам очень сложно объяснить что проблема не в скрипте а в тубе, особенно когда суппорт скрипта отвечает а туба через раз.
пойдем сначала с вашей стороны
какую конкретно вы видите проблему что надо что-то где-то экранировать при импорте ?
Don't forget to run script update
Re: Импортирует половину строк дампа
Да никаких особо проблем, за исключением что нужно создавать лишние правила в самом смарте или убирать кавычки и экранирующие символы с дампов, составленных в ручную в екселе например.
Символы обертывания для полей как-бы стандартная штука для цсв. Взять к примеру список категорий, смарт их не распознает, если в дампе будет одна категория с 2 словами в кавычках. Хотя это не противоречит правилам цсв файлов. Также если будет несколько категорий в кавычках.
В целом, на данный момент все работет вроде бы ровно, но это частный случай из возможных вариантов. Добавление в опции парсинга символов обертывания и экранирующих символов при использовании стандартных функций решит проблему (как это сделано в квс или phpmyadmin). А чтобы ничего не сломалось дефолтом просто поставить пустые строки.
П.С.
Если можно, хотел бы узнать адрес туба, дамп которого вызывает трудности в парсинге.
Символы обертывания для полей как-бы стандартная штука для цсв. Взять к примеру список категорий, смарт их не распознает, если в дампе будет одна категория с 2 словами в кавычках. Хотя это не противоречит правилам цсв файлов. Также если будет несколько категорий в кавычках.
В целом, на данный момент все работет вроде бы ровно, но это частный случай из возможных вариантов. Добавление в опции парсинга символов обертывания и экранирующих символов при использовании стандартных функций решит проблему (как это сделано в квс или phpmyadmin). А чтобы ничего не сломалось дефолтом просто поставить пустые строки.
П.С.
Если можно, хотел бы узнать адрес туба, дамп которого вызывает трудности в парсинге.
Re: Импортирует половину строк дампа
Какой из тубов выдает дамп с назаниями категорий в ковычках ?
И в целом зачем там ковычки ?
И в целом зачем там ковычки ?
Don't forget to run script update
Re: Импортирует половину строк дампа
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>"'Re: Импортирует половину строк дампа
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: Импортирует половину строк дампа
В идеальном мире - да
а в реальности дамп выглядит от некоторых тубов так
url|http://thumb_url/|embed code
some more code
code again| description
url2|http://thumb_url2/|embed code22
some more code
code again| description
и никаких ковычек
а в реальности дамп выглядит от некоторых тубов так
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
Re: Импортирует половину строк дампа
это уже не цсв, а какая-то хрень.
Почему бы не подстраивать такие файлы под стандарт, а не стандартные файлы под эту хрень?
В крайнем случае игнорить те тубы, которые говнолепят отсебятину. Нужен будет траф - подстроятся. Нет - идут лесом.
https://ru.wikipedia.org/wiki/CSV
https://en.wikipedia.org/wiki/Comma-separated_values
https://www.ietf.org/rfc/rfc4180.txt
Почему бы не подстраивать такие файлы под стандарт, а не стандартные файлы под эту хрень?
В крайнем случае игнорить те тубы, которые говнолепят отсебятину. Нужен будет траф - подстроятся. Нет - идут лесом.
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: Импортирует половину строк дампа
Понял 
Все сработало! Спасибо!
Все сработало! Спасибо!
-
GangstaBros
- Posts: 460
- Joined: Sun Jan 05, 2014 4:34 pm
Re: Импортирует половину строк дампа
кого юзать тогда?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 , никаких кавычек )







