Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将固定长度的文本文件转换为SQL_Php_Mysql_Sql - Fatal编程技术网

Php 将固定长度的文本文件转换为SQL

Php 将固定长度的文本文件转换为SQL,php,mysql,sql,Php,Mysql,Sql,我需要将固定长度的文本文件转换为MySQL表。 我最大的问题是每行包含多个单元格,这就是文件发送给我的方式,也是我想要转换它的主要原因 这些细胞都有特定的长度;但是,所有这些都包含在一行中 例如,一条线的前3个位置(1-3)是IRT,接下来的3个位置(4-6)是IFTC,接下来的5个位置(7-11)是FSC,等等 由于该文件最多可以包含300行记录,因此我需要一种简单的方法将其直接导入SQL表 我在网上搜索了几个小时,试图找到一个解决方案,但是没有逗号分隔,我还没有找到一个有效的解决方案 如果可

我需要将固定长度的文本文件转换为MySQL表。
我最大的问题是每行包含多个单元格,这就是文件发送给我的方式,也是我想要转换它的主要原因

这些细胞都有特定的长度;但是,所有这些都包含在一行中

例如,一条线的前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 | 
+-----+-------+----+