我有需要转换成数据库的文件。这些文件(我有超过100k)来自旧系统(从COBOL脚本生成)。我现在是将数据从此系统迁移到新系统的团队成员。
现在,因为我们要解析很多文件(每个文件从50mb到100mb),我想确保使用正确的方法将它们转换为sql语句。
大多数文件都具有以下格式:
#id<tab>name<tab>address1<tab>address2<tab>city<tab>state<tab>zip<tab>country<tab>#\n
address2是可选的,可以为空 或
#id<tab>client<tab>taxid<tab>tagid<tab>address1<tab>address2<tab>city<tab>state<tab>zip<tab>country<tab>#\n
这两条最常见的行(我会说大约50%),除了这些之外,所有行看起来都相同但信息不同。
现在,我的问题是如何打开它们以尽可能高效并正确解析它们?
答案 0 :(得分:10)
老实说,我不会用PHP来做这件事。我用awk。使用可预测格式的输入,它将运行得更快,您可以输出到SQL命令,您也可以通过命令行插入。
如果您还有其他原因需要使用PHP,则可能需要调查fgetcsv()函数。输出是一个数组,您可以将其解析为插入。用户提供的第一个示例之一采用CSV并将其插入MySQL。此功能确实允许您指定自己的分隔符,因此选项卡可以正常使用。
如果第一列中的id#在输入数据中是唯一的,那么你一定要将它插入到mysql的主键中,以免在重新启动批处理时重复数据。
答案 1 :(得分:2)
当我在一个需要解析庞大而复杂的日志文件(Apache,防火墙,sql)的项目上工作时,我们使用函数preg_match_all
获得了很大的性能提升(不到10%)使用爆炸/修剪/格式化所需的时间)。
大量文件(&gt; 100Mb)在2或3分钟内在核心2 duo中解析(缺点是内存消耗非常高,因为它创建了一个巨大的阵列,所有信息都可以合成)。
正则表达式允许您在同一文件中包含变体时识别行的内容。
但是如果您的文件很简单,请尝试ghoti建议(fgetscv),它会正常工作。
答案 2 :(得分:0)
如果你已经熟悉PHP,那么使用它是一个非常好的工具。
如果记录不跨越多行,那么保证不会耗尽内存的最佳方法是一次处理一行。
我还建议查看Standard PHP Library。它有很好的目录迭代器和文件对象,使得处理文件和目录比以前更好(在我看来)。
如果您可以使用CSV功能并使用SPL,请务必正确set your options选项卡字符。
在致电trim
后,您可以使用fgetcsv从第一个和最后一个字段中轻松删除#答案 3 :(得分:-2)
请坐下来解析 这是一次性操作,寻找最有效的方式毫无意义 或多或少理智的方式就足够了 事实上,你很可能会浪费更多的时间来寻找超级最佳的解决方案。说,你的代码将运行一个小时。您将花费一个小时来找到运行速度提高30%的解决方案。你将花费1,7个小时而不是1.