【发布时间】:2017-08-06 22:47:19
【问题描述】:
我正在尝试将自定义格式的 .txt 文件转换为数组。
这是第一行的示例:
[LINETYPE]S [STARTTIME]00:00:00
[LINETYPE]M [TITLE]There For You [PERFORMER]Martin Garrix & Troye Sivan [MUSICID]21120 [LABEL]
[LINETYPE]M [TITLE]Shut Up and Dance [PERFORMER]Walk The Moon [MUSICID]20634 [LABEL]
这种情况一直持续下去,一天中的每个小时都有一个新的 [LINETYPE]S。
现在,我想要实现的是为每个小时创建一个数组 - 每个值都包含另一个数组,其中括号作为键:
array("00:00:00" => array(
array("LINETYPE" => "M",
"TITLE" => "There For You",
"PERFORMER" => "Martin Garrix & Troye Sivan",
"MUSICID" => "21120",
"LABEL" => ""),
array("LINETYPE" => "M",
"TITLE" => "Shut Up And Dance",
"PERFORMER" => "Walk The Moon",
"MUSICID" => "20634",
"LABEL" => "")
), "01:00:00" => array(
[...]
);
每小时搜索的正则表达式应该是正确的,但似乎 preg_split 不支持多个捕获组。
到目前为止,我发现的所有答案都处于更基本的水平,例如爆炸逗号。
这是我目前的代码。
$test = get_musiclog("06082017");
$hours = array();
$regex = "(\[LINETYPE\]S\t\[STARTTIME\])((?:(?:[0-2][0-9])|(?:[2][0-3])|(?:[0-9])):(?:[0-5][0-9])(?::[0-5][0-9])?(?:\\s?)?)\n";
if (preg_match_all ("/".$regex."/is", $test, $matches)) {
foreach($matches[2] as $hour) {
$hours[$hour] = ""; // Music array
}
}
在想着这些问题挠头之后,几乎没有留下任何头发。谁能指出我正确的方向?
- 如何将字符串与“[LINETYPE]S [STARTTIME]XX:XX:XX”分开并保持时间为键?
- 知道结构是 [key]value\t 并且 \n 是分隔符,我如何拆分其余元素?
- “数组中的数组中的数组”是正确的做法吗?
【问题讨论】:
-
不要构建匹配所有的模式,使用 stream_get_line 以字符串
[LINETYPE]S(例如)作为第三个参数逐块读取文件。 -
不确定
"LINETYPE" => "M"是否是要保留的相关信息,似乎与文件格式本身有关。