我正在从对象(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" to" RECORD = 47"我需要从中获取数据的块。
每个RECORD可以有不同数量的字段。
一切都由" |"分隔符并没有似乎是流中的任何其他分隔符。
对于每个数据集,我需要得到:
如何做到这一点?我有多个文件需要从每个包含多个数据集的数据中提取数据,因此需要相当高效。
答案 0 :(得分:0)
以下是拆分字符串的想法:
$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()。