X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость ( Вход | Регистрация )

Открыть тему
Добавить ответ в эту тему
> fgetcsv() и запятые
WoWeb
WoWeb
Topic Starter сообщение 10.10.2017, 21:16; Ответить: WoWeb
Сообщение #1


Бывалый
****

Группа: User
Сообщений: 408
Регистрация: 18.8.2015
Поблагодарили: 168 раз
Репутация:   31  


Здравствуйте ув. форумчане, вопрос к знатокам php.
Кто сталкивался с проблемой при разборе CSV файлов с разделителем ","?
Ситуация такова, есть csv, по строкам разбивается без проблем, проблема в том что если использовать explode по зяпятой - корерктно срабатывает только если в подстроке нету запятой, если же она есть то и подстроку разбивает.
Строки с запятой в средине обрамлены двойными кавычками, но вот как их использовать никак не пойму...

например строка:
name, last name, "alabama, street 9", next string....

Подстроку alabama, street 9 разбивает еще на 2 строки, как от этого избавиться?

Сообщение отредактировал WoWeb - 10.10.2017, 21:17


--------------------
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
x64
x64
сообщение 10.10.2017, 22:24; Ответить: x64
Сообщение #2


F.A.L.L.O.U.T.
*******

Группа: Super Moderator
Сообщений: 3361
Регистрация: 30.6.2011
Из: Железнодорожный (Балашиха)
Поблагодарили: 2696 раз
Репутация:   288  


Вариант с изгалениями

Код
<?php
header('content-type:text/plain; charset=utf-8');

define('MACRO_DOUBLE_QUOTES', '#MACRO_DOUBLE_QUOTES#');
define('MACRO_COMMA_IN_QUOTES', '#MACRO_COMMA_IN_QUOTES#');
define('MACRO_COMMA', '#MACRO_SINGLE_COMMA#');

$csv_list = file('csv.txt');
$i = 1;

foreach ( array_map('trim', $csv_list) as $v ) {
    if ( '' === $v ) continue;
    $csv_row = get_line_list($v);
    
    echo "\n" . $i++ . ' => ';
    print_r($csv_row);
}

function get_line_list($str_row) {
    // заменить двойные кавычки на мнемонику
    $str_row = str_replace('""', MACRO_DOUBLE_QUOTES, $str_row);
    
    // теперь заменить на мнемонику запятые в кавычках, кавычки выкинуть
    $str_row = preg_replace_callback('!"(.+?)"!', function($match) {
        return str_replace(',', MACRO_COMMA_IN_QUOTES, $match[1]);
    }, $str_row);
    
    // меняем оставшиеся запятые на макро
    $str_row = str_replace(',', MACRO_COMMA, $str_row);
    
    // преобразовать макро-кавычки с простые двойные, запятую в кавычках в запятую
    $str_row = strtr($str_row, [MACRO_COMMA_IN_QUOTES => ',', MACRO_DOUBLE_QUOTES => '"']);
    
    // и теперь финальное разбиение
    return explode(MACRO_COMMA, $str_row);
}


В принципе, понятно, ибо в лоб.


--------------------


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
WoWeb
WoWeb
Topic Starter сообщение 10.10.2017, 22:26; Ответить: WoWeb
Сообщение #3


Бывалый
****

Группа: User
Сообщений: 408
Регистрация: 18.8.2015
Поблагодарили: 168 раз
Репутация:   31  


x64,
А если CSV файл будет на 1,5кк строк, не повесит ли подобное сервер?


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
x64
x64
сообщение 10.10.2017, 22:28; Ответить: x64
Сообщение #4


F.A.L.L.O.U.T.
*******

Группа: Super Moderator
Сообщений: 3361
Регистрация: 30.6.2011
Из: Железнодорожный (Балашиха)
Поблагодарили: 2696 раз
Репутация:   288  


Читайте файл построчно


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
WoWeb
WoWeb
Topic Starter сообщение 10.10.2017, 22:35; Ответить: WoWeb
Сообщение #5


Бывалый
****

Группа: User
Сообщений: 408
Регистрация: 18.8.2015
Поблагодарили: 168 раз
Репутация:   31  


x64, Благодарю, попробую.
Супер! То что надо, благодарю.


Сообщение отредактировал WoWeb - 10.10.2017, 22:35


--------------------


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Alexandr_js
Alexandr_js
сообщение 11.10.2017, 14:09; Ответить: Alexandr_js
Сообщение #6


Участник
***

Группа: User
Сообщений: 235
Регистрация: 21.7.2015
Поблагодарили: 42 раза
Репутация:   7  


В чем проблема использовать file?

http://php.net/manual/ru/function.file.php

Цитата
Возвращает файл в виде массива. Каждый элемент массива соответствует строке файла, с символами новой строки включительно. В случае ошибки file() возвращает FALSE.


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
WoWeb
WoWeb
Topic Starter сообщение 11.10.2017, 17:21; Ответить: WoWeb
Сообщение #7


Бывалый
****

Группа: User
Сообщений: 408
Регистрация: 18.8.2015
Поблагодарили: 168 раз
Репутация:   31  


Alexandr_js, Очень много ресурсов будет жрать, у меня csv файл большой примерно на 1,5 - 2кк строк. Если вытащить все в массив - много оперативы съест.


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Добавить ответ в эту тему
Быстрый ответ
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Буквы, запятые, точки превращаю в чудо строчки.
Напишу текст увлекательный, для клиентов привлекательный.
15 Vinessa 3808 20.5.2016, 23:46
автор: parazit


 



RSS Текстовая версия Сейчас: 21.10.2017, 4:55
Дизайн