解析php数据的最短最快方法

解析php数据的最短最快方法,php,mysql,import,Php,Mysql,Import,我有需要转换成数据库的文件。这些文件(我有超过10万个)来自旧系统(由COBOL脚本生成)。我现在是将数据从此系统迁移到新系统的团队的一员 现在,因为我们有很多文件要解析(每个文件的大小从50mb到100mb),所以我想确保使用正确的方法将它们转换为sql语句 大多数文件具有以下格式: #id<tab>name<tab>address1<tab>address2<tab>city<tab>state<tab>zip<t

我有需要转换成数据库的文件。这些文件(我有超过10万个)来自旧系统(由COBOL脚本生成)。我现在是将数据从此系统迁移到新系统的团队的一员

现在,因为我们有很多文件要解析(每个文件的大小从50mb到100mb),所以我想确保使用正确的方法将它们转换为sql语句

大多数文件具有以下格式:

#id<tab>name<tab>address1<tab>address2<tab>city<tab>state<tab>zip<tab>country<tab>#\n
#idnameaddress1address2citystatezipcountry\n
地址2是可选的,可以为空 或

#idclienttaxidtagidadress1address 2citystatezipccountry\n
这是两条最常见的线(我会说大约50%),除此之外,所有的线看起来都一样,但信息不同


现在,我的问题是,我应该怎么做才能尽可能高效地打开它们并正确地解析它们?

老实说,我不会为此使用PHP。我会用awk。有了这样的可预测格式的输入,它将运行得更快,您可以输出到SQL命令中,也可以通过命令行插入这些命令

如果您有其他需要使用PHP的原因,您可能需要研究该函数。输出是一个数组,您可以将其解析为insert。第一个用户提供的示例之一是获取CSV并将其插入MySQL。这个函数允许您指定自己的分隔符,所以tab就可以了


如果第一列中的id#在输入数据中是唯一的,那么您肯定应该将其插入mysql的主键中,以避免在必须重新启动批处理时复制数据。

当我在一个需要解析庞大而复杂的日志文件(Apache、防火墙、sql)的项目中工作时,使用函数
preg\u match\u all
(使用explode/trims/formatting所需的时间不到10%),我们的性能有了很大的提高

巨大的文件(>100Mb)在2到3分钟内就可以在core 2 duo中解析(缺点是内存消耗非常高,因为它创建了一个巨大的数组,其中包含所有准备合成的信息)

正则表达式允许您在同一文件中有变化时识别行的内容


但是,如果您的文件很简单,请尝试ghoti suggestion(fgetscv),它会很好地工作。

如果您已经熟悉PHP,那么使用它是一个非常好的工具

如果记录不跨多行,确保不会耗尽内存的最佳方法是一次处理一行

我还建议你看一下这个。它有很好的目录迭代器和文件对象,这使得处理文件和目录比以前更好了(在我看来)

如果您可以使用CSV功能和SPL,请确保为制表符正确输入

调用

后,您可以使用从第一个和最后一个字段中轻松删除#,只需坐下来解析即可。
这是一次性操作,寻找最有效的方法毫无意义。
稍微理智一点就够了。

事实上,很有可能你会浪费更多的时间去寻找超级超优的解决方案。比如说,你的代码将运行一个小时。您将再花一个小时找到一个运行速度快30%的解决方案。你将花费1,7小时,而不是1小时

对不起,我不熟悉这个,你能给我举个例子吗?当然<代码>awk'BEGIN{FS=sprintf(“\c”,9);}{printf(“插入值…(.0f,\%s\”,…);”,$1,$2,…);)“output.sqlawk的标准输出将是一系列插入,您可以通过管道在命令行上插入mysql:
mysql-hdbhost-uusername-ppassword dbname
我不知道您使用的是什么操作系统或数据库。您可以在unix、Linux、BSD等系统中使用pgsql、sybase等实现这一点。
#id<tab>client<tab>taxid<tab>tagid<tab>address1<tab>address2<tab>city<tab>state<tab>zip<tab>country<tab>#\n