【问题标题】:PHP: How to split varying length data intoPHP:如何将不同长度的数据拆分为
【发布时间】:2015-10-23 00:19:57
【问题描述】:

我正在从一个对象(OLE 二进制文件)中读取数据,并且需要找到一种方法将数据拆分为数组或其他格式,以便获得所需的少量信息。我不确定如何实现这一点。

数据是这样进来的:

|some_other_delimited_data|RECORD=1|FIELD_1=A|FIELD_2=B|FIELD_3=C|RECORD=21|FIELD_1=C|FIELD_4=D|FIELD_5=E|RECORD=47|FIELD_6=F||RECORD=1 |FIELD_1=G|FIELD_2=H|RECORD=37|FIELD_8=J|FIELD_9=K|FIELD_10=L|RECORD=40|FIELD_11=M|RECORD=47|FIELD_6=N|some_more_delimited_data|

每个数据集都以“RECORD=1”开头,其中包含多个字段,然后是其他记录。这些记录(编号 2-46)中的每一个都可以出现多次,并且具有不同数量的字段(即 RECORD=17 可以出现五次,并且每个记录具有不同数量的字段)。数据集以 RECORD=47 及其字段结束。完整的数据集包含在 RECORD=1 和 RECORD=47 之间,包括 RECORD=1 和 RECORD=47。

存在多个数据集,因此我需要从多个“RECORD=1”到“RECORD=47”块获取数据。

每个 RECORD 可以有不同数量的字段。

所有内容都用“|”分隔分隔符,并且流中似乎没有任何其他分隔符。

对于每个数据集,我需要得到:

  • 从 RECORD=24,来自 FIELD_1 的数据,其中 FIELD_2="FOO"
  • 从 RECORD=31,来自 FIELD_1 的数据,其中 FIELD_2="BAR"

如何做到这一点?我有多个文件,需要从每个包含多个数据集的文件中提取数据,因此它需要相当高效。

【问题讨论】:

  • 如果它是一个 OLE 文件,你可以使用OLE 包来解析它吗? github.com/pear/OLE
  • 这不是一项复杂的任务。只是尝试并继续尝试。要在 PHP 中标记您的数据,请尝试创建函数,尝试并出错,但完成这项工作。

标签: php arrays split field explode


【解决方案1】:

这是一个拆分字符串的想法:

$stream = "|some_other_delimited_data|RECORD=1|FIELD_1=A|FIELD_2=B|FIELD_3=C|RECORD=21|FIELD_1=C|FIELD_4=D|FIELD_5=E|RECORD=47|FIELD_6=F||RECORD=1|FIELD_1=G|FIELD_2=H|RECORD=37|FIELD_8=J|FIELD_9=K|FIELD_10=L|RECORD=40|FIELD_11=M|RECORD=47|FIELD_6=N|some_more_delimited_data|";

$matches = array();
preg_match_all ("/RECORD=([0-9]+)((\|FIELD_[0-9]+=[A-Z]+)+)/", $stream, $matches, PREG_SET_ORDER);

$array = array();
foreach ($matches as $match) {
    $submatches = array();
    preg_match_all ("/\|FIELD_([0-9]+)=([A-Z]+)/", $match[2], $submatches, PREG_SET_ORDER);
    $fields = array();
    foreach($submatches as $submatch) {
        $fields[$submatch[1]] = $submatch[2];
    }
    $array[] = array('record' => $match[1], 'fields' => $fields);
}

print_r($array);

现在从数组中提取所需的值应该很容易了,使用 array_keys()、array_search() 和 array_column()。

【讨论】:

    猜你喜欢
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多