Php 将固定长度的文本文件转换为SQL
我需要将固定长度的文本文件转换为MySQL表。Php 将固定长度的文本文件转换为SQL,php,mysql,sql,Php,Mysql,Sql,我需要将固定长度的文本文件转换为MySQL表。 我最大的问题是每行包含多个单元格,这就是文件发送给我的方式,也是我想要转换它的主要原因 这些细胞都有特定的长度;但是,所有这些都包含在一行中 例如,一条线的前3个位置(1-3)是IRT,接下来的3个位置(4-6)是IFTC,接下来的5个位置(7-11)是FSC,等等 由于该文件最多可以包含300行记录,因此我需要一种简单的方法将其直接导入SQL表 我在网上搜索了几个小时,试图找到一个解决方案,但是没有逗号分隔,我还没有找到一个有效的解决方案 如果可
我最大的问题是每行包含多个单元格,这就是文件发送给我的方式,也是我想要转换它的主要原因 这些细胞都有特定的长度;但是,所有这些都包含在一行中 例如,一条线的前3个位置(1-3)是IRT,接下来的3个位置(4-6)是IFTC,接下来的5个位置(7-11)是FSC,等等 由于该文件最多可以包含300行记录,因此我需要一种简单的方法将其直接导入SQL表 我在网上搜索了几个小时,试图找到一个解决方案,但是没有逗号分隔,我还没有找到一个有效的解决方案
如果可能的话,我想用
PHP
编写这个解决方案。如果有人能给我函数名,我愿意花很长的时间研究如何使用所需的函数,我不希望人们为我编写代码。你可能不会很喜欢它,但要实现你的目标,确实没有一种简单的方法。很久以前(大约1991年),我编写了一个工具DBLDFMT(用于“数据库加载格式”)来处理这种固定长度的非分隔文件。它被调优为生成Informix数据库首选的加载格式(因此默认情况下它使用管道符号来分隔字段,但当然可以使用命令行选项或环境变量进行调优)。但是,它可以创建分隔数据,然后您可以使用命令更正常地处理这些数据
如果您需要DBLDFMT的源代码,请通过电子邮件与我联系(请参阅我的个人资料)。(从2008年开始的当前版本3.17没有对CSV输出的直接支持。添加它并不困难。您或多或少可以达到所需的效果,但应该比现在容易得多。)文件:
testfile.txt (4 rows)
AAA11111xx
BBB22222yy
CCC33333zz
DDD 444 aa
表:
CREATE TABLE TestLoadDataInfile
( a VARCHAR(3)
, b INT(5)
, c CHAR(2)
) CHARSET = latin1;
代码:
结果:
mysql> SELECT * FROM TestLoadDataInfile ;
+-----+-------+----+
| a | b | c |
+-----+-------+----+
| AAA | 11111 | xx |
| BBB | 22222 | yy |
| CCC | 33333 | zz |
| DDD | 444 | aa |
+-----+-------+----+
此时,加载数据填充文档不是很好(固定大小的字段)。以下是相关部分:
- 如果字段以和结尾 由值括起的值均为空 (“”),一个固定行(非delimited) 使用的格式为。使用固定行格式, 字段之间不使用分隔符 (但你仍然可以打电话 终结者)。而是列值 使用字段进行读写 宽度足以容纳所有值 在野外。对于TINYINT、SMALLINT, MEDIUMINT,INT和BIGINT,字段 宽度为4、6、8、11和20, 分别,不管是什么 声明的显示宽度为
空处理 使用固定行格式(使用 当字段以和结尾时 由括起的为(均为空),NULL为 写为空字符串。注意 这会导致空值和空值 要删除的表中的字符串 当写入到 文件,因为两者都写为空 串。如果你需要能够 阅读文章时要把这两者分开 文件返回,不应使用 固定行格式
有些情况不受载荷的支持 数据填充:
- 固定大小的行(以结尾的字段和以结尾的字段) 空)和BLOB或文本列
- 在以下情况下不能使用用户变量: 加载固定行格式的数据 因为用户变量没有 显示宽度
您可以通过
\n
或\r\n
进行拆分以获得“行”,然后可以使用substr()要获取所需的每一行的部分,然后插入加载数据填充:@ypercube:您所指的描述不处理固定长度字段,字段之间没有分隔符。@Jonathan:我觉得它可以处理固定长度字段。也许旧版本不能?@Jonathan:第一条用户评论!(这告诉我们一些关于文档的信息…)哦,有趣!如果我将其解释为:如果您有一个带有简单b INT
列的表(与b INT(5)
相反),您将无法为INT数据加载5个字符的数据?即使该列最多可以包含9位数字(因此表是使用b INT(9)创建的)
,您将无法加载恰好为列保留了5个字符的文件?因此,您无法将任意固定数据读取到DBMS中;只能将恰好为特定表设置了正确宽度的内容进行格式化。@Jonathan:我刚刚测试过,是的,您是对的。但是,您可以将数据读取到CHAR或VAR中CHAR字段,然后将它们转换为所需的数据类型。
mysql> SELECT * FROM TestLoadDataInfile ;
+-----+-------+----+
| a | b | c |
+-----+-------+----+
| AAA | 11111 | xx |
| BBB | 22222 | yy |
| CCC | 33333 | zz |
| DDD | 444 | aa |
+-----+-------+----+