Разобрать файл CSV и сопоставить шаблон в PHP

У меня есть файл CSV следующим образом

***Client Name: abc***,
,
# ----------------------------------------,
# Twitter : Mentions - Count,
# ----------------------------------------,
Date/Time (GMT),abc
6/6/2013,1
6/11/2013,3
6/12/2013,2
6/13/2013,1
6/14/2013,2
6/15/2013,4
6/17/2013,4
6/18/2013,8
6/19/2013,7
# *** Interval: Daily ***,
,
***Client Name: abc***,
,
# ----------------------------------------,
# Facebook Insights : Likes by Source,
# ----------------------------------------,
Sources,Likes
Mobile,3602
Page Profile,470
Recommended Pages,86
Ads,64
Like Story,49
Mobile Sponsored Page You May Like,44
Page Browser,33
Search,22
Timeline,16
Mobile Page Suggestions On Liking,15
3 more sources,48
,
***Client Name: xyz***,
,
# ----------------------------------------,
# Twitter : Mentions - Count,
# ----------------------------------------,
Date/Time (GMT),xyz
6/12/2013,1
# *** Interval: Daily ***,
,
***Client Name: pqr***,
,
# ----------------------------------------,
# Twitter : Mentions - Count,
# ----------------------------------------,
Date/Time (GMT),pqr
6/6/2013,2
6/7/2013,3
6/9/2013,6
6/10/2013,1
6/12/2013,4
6/13/2013,1
6/14/2013,9
6/15/2013,5
6/16/2013,1
6/18/2013,2
6/19/2013,2
# *** Interval: Daily ***,

из которых я хочу извлечь Twitter: Упоминания - Подсчитайте данные и сохраните все в базе данных.

Я хочу контент между

# ----------------------------------------,
# Twitter : Mentions - Count,
# ----------------------------------------,

и

 # *** Interval: Daily ***,

Как я могу сопоставить этот шаблон в PHP, есть ли какой-либо класс php, который соответствует шаблону из файла, или как я могу сделать это с помощью regax.

Я понятия не имею о сопоставлении с образцом. Я только что попытался прочитать CSV-файл, используя fgetcsv() как

 $file = fopen($uploaded_file_path, 'r');
            echo "<pre>";
            while (($line = fgetcsv($file)) !== FALSE) {
              print_r($line);
            }
            fclose($file);

person Subodh Ghulaxe    schedule 03.07.2013    source источник
comment
@Usman, пожалуйста, проверьте обновленный вопрос.   -  person Subodh Ghulaxe    schedule 03.07.2013
comment
Теперь я проверяю этот ответ stackoverflow.com/a/9826656/1868660   -  person Subodh Ghulaxe    schedule 03.07.2013


Ответы (2)


Описание

Это регулярное выражение найдет заголовок каждого раздела Twitter Mentions - Count и захватит тело раздела в группу 1.

^\#\sTwitter\s:\sMentions\s-\sCount,[\s\r\n]+    # match the header
^\#\s----------------------------------------,[\s\r\n]+   # match the separator line
(^(?:(?!\#\s\*\*\*\sInterval:\sDaily\s\*\*\*,).)*)    # match the rest of the string upto the first Interval Daily

введите здесь описание изображения

Расширенный

  • Этот первый раздел просто находит начало каждого блока, в нем много символов, но он в основном прямолинеен.

    • ^ match the start of a line, requires the of the multiline option which is usually m
    • \#\sTwitter\s:\sMentions\s-\sCount, соответствует этой точной строке, обратите внимание, что \s будет соответствовать символу пробела, я делаю это, потому что мне нравится использовать параметр игнорирования пробела, который обычно равен x
    • [\s\r\n]+ соответствует одному или нескольким пробелам или символам новой строки.
    • ^\#\s----------------------------------------,[\s\r\n]+ Это соответствует символам в строке-разделителе от начала строки ^ до символа новой строки в конце
  • Этот раздел отражает основную часть раздела, и именно здесь происходит настоящее волшебство.

    • ( Start the capture group 1
    • ^ убедитесь, что мы совпали с началом строки. Это гарантирует правильную проверку следующего просмотра вперед
    • (?: начать группу без захвата. Конструкция этой группы без захвата является самозавершающейся, когда она встречает нежелательную строку внутри отрицательного просмотра вперед. Это приведет к захвату каждого символа между заголовком раздела выше и конечной строкой.
    • (?! начать отрицательный просмотр вперед, это подтвердит, что мы не попадаем в нежелательный закрытый текст, который отмечает конец раздела.
    • \#\s\*\*\*\sInterval:\sDaily\s\*\*\*, соответствует нежелательному тексту. Если это найдено, то отрицательный просмотр не удастся
    • ) закрыть негативный взгляд вперед
    • . соответствует любому символу, ожидается, что опция «точка соответствует новой строке» обычно s.
    • ) закрыть группу без захвата
    • * разрешить группе без захвата повторяться ноль или более раз.
    • ) закрыть группу захвата 1. Поскольку все, что произошло внутри этой группы захвата, все совпадающие . будут храниться здесь.

Пример PHP

Живой пример: http://www.rubular.com/r/stgaiBeSE1

Образец текста

***Client Name: abc***,
,
# ----------------------------------------,
# Twitter : Mentions - Count,
# ----------------------------------------,
Date/Time (GMT),abc
6/6/2013,1
6/11/2013,3
6/12/2013,2
6/13/2013,1
6/14/2013,2
6/15/2013,4
6/17/2013,4
6/18/2013,8
6/19/2013,7
# *** Interval: Daily ***,
,
***Client Name: abc***,
,
# ----------------------------------------,
# Facebook Insights : Likes by Source,
# ----------------------------------------,
Sources,Likes
Mobile,3602
Page Profile,470
Recommended Pages,86
Ads,64
Like Story,49
Mobile Sponsored Page You May Like,44
Page Browser,33
Search,22
Timeline,16
Mobile Page Suggestions On Liking,15
3 more sources,48
,
***Client Name: xyz***,
,
# ----------------------------------------,
# Twitter : Mentions - Count,
# ----------------------------------------,
Date/Time (GMT),xyz
6/12/2013,1
# *** Interval: Daily ***,
,
***Client Name: pqr***,
,
# ----------------------------------------,
# Twitter : Mentions - Count,
# ----------------------------------------,
Date/Time (GMT),pqr
6/6/2013,2
6/7/2013,3
6/9/2013,6
6/10/2013,1
6/12/2013,4
6/13/2013,1
6/14/2013,9
6/15/2013,5
6/16/2013,1
6/18/2013,2
6/19/2013,2
# *** Interval: Daily ***,

Код

<?php
$sourcestring="your source string";
preg_match_all('/^\#\sTwitter\s:\sMentions\s-\sCount,[\s\r\n]+
^\#\s----------------------------------------,[\s\r\n]+
(^(?:(?!\#\s\*\*\*\sInterval:\sDaily\s\*\*\*,).)*)/imsx',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

Совпадения из группы захвата 1

[0] => Date/Time (GMT),abc
    6/6/2013,1
    6/11/2013,3
    6/12/2013,2
    6/13/2013,1
    6/14/2013,2
    6/15/2013,4
    6/17/2013,4
    6/18/2013,8
    6/19/2013,7

[1] => Date/Time (GMT),xyz
    6/12/2013,1

[2] => Date/Time (GMT),pqr
    6/6/2013,2
    6/7/2013,3
    6/9/2013,6
    6/10/2013,1
    6/12/2013,4
    6/13/2013,1
    6/14/2013,9
    6/15/2013,5
    6/16/2013,1
    6/18/2013,2
    6/19/2013,2

            )
person Ro Yo Mi    schedule 04.07.2013
comment
вы молодцы, можете объяснить, какие шаги вы использовали, чтобы найти это регулярное выражение, как вы создали это изображение. - person Subodh Ghulaxe; 04.07.2013
comment
:) Ну, технически я написал это в блокноте Windows, прежде чем запускать этот живой пример. Для изображения я использую debuggex.com. Хотя он не поддерживает просмотр назад, именованные группы захвата или атомарные группы, он по-прежнему удобен для понимания потока выражений. Существует также regexper.com. Они тоже делают довольно хорошую работу, но это не в реальном времени, когда вы печатаете. - person Ro Yo Mi; 04.07.2013
comment
Я обновил ответ подробным расширенным объяснением выражения, наслаждайтесь. - person Ro Yo Mi; 04.07.2013
comment
@RoYoMi Спасибо за ответ, можете ли вы сказать мне, что такое $sourcestring=ваша исходная строка; ‹-- - person B Karthik Kumar; 12.10.2017
comment
@BKarthikKumar Я решил выделить исходный текст в раздел исходного ответа. Сам исходный текст выглядит как программный код, и я чувствовал, что встраивание его в код примера может сбить с толку. - person Ro Yo Mi; 13.10.2017

попробуй это

public static function csv_to_array($filename='', $delimiter=',')
 { 
    if(!file_exists($filename) || !is_readable($filename))
        return FALSE;

    $header = NULL;
    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE)
    {
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
        {
                $data[] = $row;
        }
        fclose($handle);
    }
    return $data;
 }
person user2519573    schedule 03.07.2013