2

我有一个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 来做到这一点。

我对模式匹配一​​无所知我刚刚尝试使用 fgetcsv() 读取 csv 文件

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

2 回答 2

1

描述

此正则表达式将找到每个节标题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

在此处输入图像描述

展开

  • 第一部分简单地找到每个块的开始,它有很多字符,但基本上是直截了当的。

    • ^匹配一行的开头,需要多行选项,通常是m
    • \#\sTwitter\s:\sMentions\s-\sCount,匹配这个确切的字符串,注意\s将匹配一个空格字符,我这样做是因为我喜欢使用忽略空格选项,这通常是x
    • [\s\r\n]+匹配一个或多个空格或换行符。
    • ^\#\s----------------------------------------,[\s\r\n]+这匹配分隔行中从行^首到末尾的换行符的字符
  • 这个部分捕捉了部分的主体,是真正的魔法发生的地方。

    • (启动捕获组 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

            )
于 2013-07-04T03:12:30.067 回答
0

尝试这个

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;
 }
于 2013-07-03T07:58:25.360 回答