【问题标题】:convert a txt file into array with php使用php将txt文件转换为数组
【发布时间】:2021-06-19 10:41:01
【问题描述】:

你将如何从文件中获取以下文本并将其转换为数组?下面是我用来读取文件的代码,但现在它只将所有内容放入一个数组中

<?php
$fileString = file_get_contents("test.txt");
  //print_r($fileString);

  //$words = preg_split("/^0\s*$/m", $fileString);
  //print_r($words);
  $rows = explode("\r", $fileString);
  print_r($rows);
 ?>

test.txt below

0
CIRCLE
8
V_DrillSF_16
39
16
10
765.1
20
57.0
30
0
40
4.0
0
CIRCLE
8
V_DrillSFS
39
16
10
765.1
20
57.0
30
0
40
3.5
0
CIRCLE
8
V_DrillSF_16
39
16
10
765.1
20
89.0
30
0
40
4.0
0
CIRCLE
8
V_DrillSF_16
39
16
10
765.1
20
249.0
30
0
40
4.0

我想将每个“CIRCLE”分组分解或标识为自己的数组,这样我就可以将其添加到数据库中,每个“CIRCLE”分组都以 0 开头,并且每次都具有相同的行数。

[0] => Array
(
[0]=>0
[1]=>CIRCLE
[2]=>8
[3]=>V_DrillS_16
[4]=>39
[5]=>16
[6]=>10
[7]=>765.1
[8]=>20
[9]=>57.0
[10]=>30
[11]=>0
[12]=>40
[13]=>4.0
)

【问题讨论】:

  • 目前尚不清楚预期数组的最终格式应该是什么。 $rows 当前是一个数组,如 print_r($rows); 所见。听起来下一步是使用a foreach loop 或a for loop 迭代$rows 并检查项目的值。然后可能将该项目添加到不同的数组(最后返回),具体取决于它是否为CIRCLE?你是在暗示0\rCIRCLE\r8 是一个部分的开始吗?
  • 仅供参考,您可以使用内置函数file() 将文件读入数组。那么问题就变成了如何对数组的元素进行分组。
  • “每个“CIRCLE”分组都以 0 开头,并且每次都有相同的行数” - 所以在按照 @Barmar 的建议使用 file 之后,这应该那么不需要更多array_chunk。根本不需要开始搞乱正则表达式。

标签: php regex parsing


【解决方案1】:

您可以在0\nCIRCLE 出现的位置拆分文件内容,然后用换行符(序列)分解每个块(您可以再次使用正则表达式,或者只使用explode)。

这是一个带有CRLF 换行符的示例:

$fileString = "0\r\nCIRCLE\r\n8\r\nV_DrillSF_16\r\n39\r\n16\r\n10\r\n765.1\r\n20\r\n57.0\r\n30\r\n0\r\n40\r\n4.0\r\n0\r\nCIRCLE\r\n8\r\nV_DrillSFS\r\n39\r\n16\r\n10\r\n765.1\r\n20\r\n57.0\r\n30\r\n0\r\n40\r\n3.5\r\n0\r\nCIRCLE\r\n8\r\nV_DrillSF_16\r\n39\r\n16\r\n10\r\n765.1\r\n20\r\n89.0\r\n30\r\n0\r\n40\r\n4.0\r\n0\r\nCIRCLE\r\n8\r\nV_DrillSF_16\r\n39\r\n16\r\n10\r\n765.1\r\n20\r\n249.0\r\n30\r\n0\r\n40\r\n4.0";
$res = preg_split('~(*ANYCRLF)\R(?=0\RCIRCLE$)~m', $fileString);
print_r(array_map(function($x) { return explode("\r\n", $x); }, $res));

请参阅PHP demo。

正则表达式详细信息:

  • (*ANYCRLF) - \R 现在匹配 CRLF、LF 或 CR 行尾
  • \R - 一个或多个换行序列
  • (?=^0\RCIRCLE$) - 匹配的积极前瞻
    • ^ - 行首(由于m、^ 匹配行首)
    • 0 - 一个0
    • \R - 单个换行序列
    • CIRCLE - CIRCLE 字符串
    • $ - 一行结束。

【讨论】:

  • 如果我完全按照你的方式使用它,我就能让它工作。但是当我用 $fileString = file_get_contents("test.txt"); 替换你的文件字符串时我无法让它工作。 text.txt 中的每一行都是 CR LF
  • @heykarch 只需使用explode("\r\n", $x); 或preg_split('~\R+~u', $x)。
  • 谢谢,但我尝试了上面的 test.txt(与上面列出的数据相同),你的两个建议都将所有内容放入一个数组中
  • @heykarch 查看更新。您很可能需要 PCRE 动词 (*ANYCRLF) 才能使 \R 正常工作。
  • 那行得通... (*ANYCRLF) 究竟做了什么来完成这项工作?
猜你喜欢
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 2011-04-27
  • 2017-10-09
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
相关资源
最近更新 更多