Php 读取、排序文本文件并将其拆分为块

Php 读取、排序文本文件并将其拆分为块,php,Php,我正在尝试为以下任务重新激活我的php知识: 我有一个较大的文本文件,其中包含未排序的逗号分隔信息行,每个值都用一个“.”括起来。 每一行都可以理解为一个数据集,该行的第一个值告诉我该行属于哪个表 现在,我需要读取文件,对行进行排序(以便属于同一个表的行放在一起),检测不同的块并将它们保存在单独的文本文件中。之后,我可以使用Infle中的load data快速导入mysql数据库 因此,我可以打开文件并通过以下方式对行进行排序: <?php $lines = file("importfil

我正在尝试为以下任务重新激活我的php知识: 我有一个较大的文本文件,其中包含未排序的逗号分隔信息行,每个值都用一个“.”括起来。 每一行都可以理解为一个数据集,该行的第一个值告诉我该行属于哪个表

现在,我需要读取文件,对行进行排序(以便属于同一个表的行放在一起),检测不同的块并将它们保存在单独的文本文件中。之后,我可以使用Infle中的load data快速导入mysql数据库

因此,我可以打开文件并通过以下方式对行进行排序:

<?php
$lines = file("importfile_unsorted.txt");
natsort($lines);
file_put_contents("importfile_sorted.txt", implode($lines));
?>
..…[这将是第一个块,所有这些行都应保存在“av.txt”中 在下一行中,新块“F”以几行开始:

"F1","D","D","Deutsch",,,"0","W"
"F4","E","E","Englisch",,,"0","W"
"F7","K","K","Kath.Religionslehre",,,"0","W"
"F8","Ev","Ev","Evang.Religionslehre",,,"0","W"
"F9","Eth","Eth","Ethik",,,"0","W"
…[将所有这些以Fxx开头的行保存到文件f.txt中,然后转到下一个块]

"G1","PhL","PÜG"
"G2","ChL","ChÜ"

…等等。稍后,有一些块具有固定的第一列,如下所示:

"AV1","0","0","0","0","0","0","0","0","0","0","0:0","0:0","0:0"
"AV2","0","0","0","0","0","0","0","0","0","0","0:0","0:0","0:0"
"PL","Di 1","Ba","Q12","Inf1","CoR1"
"PL","Di 1","Bb","Q12","F","Ü2"
"PL","Di 1","Eg","Q12","L","M23"
。。。 及

。。。 然后是其他几个块(L1…L97、M、R1…R40、U1…U560)

我知道所有可能的块的“标识符”(AVx、Fx、Gx、…PL、PLS…),但也有可能省略了一个块,并且输入文件根本没有一行。 输入文件总共包含大约4000行,因此性能不应该太低(虽然它不是时间关键型的,但导入可能一年执行10次..)

那么,有没有一种方法可以以“智能”和快速的方式完成这项工作,或者我应该逐行读取输入文件,检测并记住第一个值,将当前行添加到结果字符串并循环,直到出现新的第一个值

谢谢你的帮助!
Heiko

使用内置的CSV解析器,不要手动拆分
使用内置的CSV解析器,不要手动拆分

为什么要将文件拆分为单独的文件?我要做的是创建一个临时表,该临时表也包含第一列,将所有内容导入该临时表。然后使用php查询列1的不同列表,循环并运行查询
INSERT into{$tableName}从tmp_表中选择col2、col3…等,其中col1='{$tableName}“
。如果每个表的列数可变,只需在php中描述每个表即可获得列,并只选择所需的列。此外,使临时表具有所需的最大列数。感谢Jonathan的快速回答。我更喜欢拆分,因为使用load data infile将数据导入mysql是一种非常简单的方法sy和fast,因此我正在寻找一种分割输入文件的好方法。此外,不同块之间的数据类型不同(例如,块1中的秒字段为int,块2中的秒字段为time…)@Jonathan Kuhn,我终于有时间听从你的建议了。我原以为这会更复杂,但一切都会顺利而快速,所以感谢你为我指明了正确的方向!为什么要将文件拆分为单独的文件?我要做的是创建一个临时表,该临时表也包含第一列,将所有内容导入其中。然后使用php要查询列1的不同列表,循环并只运行查询
INSERT-INTO{$tableName},从tmp_表中选择col2、col3…等,其中col1='{$tableName}“
。如果每个表的列数可变,只需在php中描述每个表即可获得列,并只选择所需的列。此外,使临时表具有所需的最大列数。感谢Jonathan的快速回答。我更喜欢拆分,因为使用load data infile将数据导入mysql是一种非常简单的方法sy和fast,因此我正在寻找一种分割输入文件的好方法。此外,不同块之间的数据类型不同(例如,块1中的秒字段为int,块2中的秒字段为time…)@Jonathan Kuhn,我终于有时间听从你的建议了。我原以为这会更复杂,但一切都会顺利而快速,所以感谢你为我指明了正确的方向!嗯。好吧,这会将整个输入文件放在一个巨大的数组中,但我仍然需要识别不同的块,并将它们保存到单独的文本文件中ht?正确,你用它来解析数据,然后开始做你想做的事情。嗯。好的,这会把整个输入文件放在一个巨大的数组中-但我仍然需要识别不同的块并将它们保存到单独的文本文件中,对吗?正确,你用它来解析数据,然后开始做你想做的事情。
"PL","Di 1","Ba","Q12","Inf1","CoR1"
"PL","Di 1","Bb","Q12","F","Ü2"
"PL","Di 1","Eg","Q12","L","M23"
"PLS","Di 1","Am"," frei "
"PLS","Di 1","Bad"," ----"
"PLS","Di 1","Bk"," frei "