2016-11-02 193 views
1

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

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

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

<?php 
$lines = file("importfile_unsorted.txt"); 
natsort($lines); 
file_put_contents("importfile_sorted.txt", implode($lines)); 
?> 

This works。但现在我陷入困境。 importfile_sorted.txt看起来是这样的:

"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" 

... [这将是第一个块,所有这些行应该保存在“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Ü" 

..

"K1","5a","5a",,"304","Ma","Wei","0","16","16","5",,,,,"1","1","0",,"0","0","0","0" 
"K2","5b","5b",,"303","Wo","Hm","0","32","16","5",,,,,"1","1","0",,"0","0","0","0" 
"K3","5c","5c",,"302","Gr","Ro","0","32","16","5",,,,,"1","1","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" 

... 和

"PLS","Di 1","Am"," frei " 
"PLS","Di 1","Bad"," ----" 
"PLS","Di 1","Bk"," frei " 

... 其次是其他几个块(L1 ... L97,M R1 ... R40,U1 ... U560)。

我知道块的所有可能的“标识符”(AVx,Fx,Gx,.. PL,PLS ..),但是也可以省略块并且输入文件不是单行它根本就没有。 输入文件一共包含大约4000行,所以性能不应该太低(尽管它不是时间关键,每年可能导入10次)。

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

感谢您的帮助! 海科

+0

为什么分割文件到单独的文件?我会做的是创建一个临时表,并将第一列导入到该表中。然后使用php来查询第1列的不同列表,循环并仅运行查询'INSERT INTO {$ tableName} SELECT col2,col3 ... etc从tmp_table WHERE col1 ='{$ tableName}''。如果每个表的列数都是可变的,则只需在php中描述每个表以获取列并仅选择所需内容。此外,使临时表具有您需要的最大数量的列。 –

+0

感谢乔纳森的快速回答。我宁愿分裂,因为使用加载数据infile将数据导入到mysql很容易和快速,所以我正在寻找一种分割输入文件的好方法。另外,不同块之间的数据类型也不相同(例如,块1中的第二个字段为int,块2中为时间...)。 – Heiko

+0

@Jonathan Kuhn,我终于有时间按照你的建议。我认为这会更复杂,但一切都平稳快速,所以谢谢你指点我正确的方向! – Heiko

回答

0

使用内置的CSV解析器,不拆这个手动 http://php.net/manual/en/function.str-getcsv.php

+0

嗯。好吧,这将把整个输入文件放在一个巨大的数组中 - 但我仍然必须识别不同的块并将它们保存到单独的文本文件中,对吗? – Heiko

+0

正确,你用这个解析数据,然后开始做你将要做的事情。 – TravisO

相关问题