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

时间:2011-07-03 16:47:34

标签: php mysql sql

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

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

例如,一行的前3个位置(1 - 3)是IRT,接下来的三个位置(4-6)是IFTC,接下来的5个位置(7 - 11)是FSC等。

由于该文件最多可包含300行记录,因此我需要一种简单的方法将其直接导入SQL表。

我一直在网上寻找解决方案几个小时,但是如果没有逗号分隔,我还没有找到合适的解决方案。

我想在PHP中编写此解决方案,如果可能的话。如果有人可以给我功能名称,我愿意花很长时间研究如何使用所需的功能,我不希望别人为我编写代码。

2 个答案:

答案 0 :(得分:7)

档案:

testfile.txt (4 rows)

AAA11111xx
BBB22222yy
CCC33333zz
DDD 444 aa

表:

CREATE TABLE TestLoadDataInfile
( a VARCHAR(3)
, b INT(5)
, c CHAR(2)
) CHARSET = latin1;

代码:

LOAD DATA INFILE 'D:\\...\\testfile.txt'
INTO TABLE TestLoadDataInfile
FIELDS TERMINATED BY ''
LINES TERMINATED BY '\r\n' ;

结果:

mysql> SELECT * FROM TestLoadDataInfile ;
+-----+-------+----+
| a   | b     | c  | 
+-----+-------+----+ 
| AAA | 11111 | xx | 
| BBB | 22222 | yy | 
| CCC | 33333 | zz | 
| DDD |   444 | aa | 
+-----+-------+----+ 

LOAD DATA INFILE文档在这一点上并不是很好(固定大小的字段)。这是相关部分:

  
      
  • 如果FIELDS TERMINATED BY和FIELDS   ENCLOSED BY值均为空   (''),固定行(nondelimited)   使用格式。采用固定行格式,   字段之间没有使用分隔符   (但你仍然可以有一条线   终止)。相反,列值   使用字段读取和写入   宽度足以容纳所有值   在该领域。对于TINYINT,SMALLINT,   MEDIUMINT,INT和BIGINT,该字段   宽度为4,6,8,11和20,   分别,无论如何   声明的显示宽度是。
  •   
     

LINES TERMINATED BY仍然习惯   分开的线条。如果一条线没有   包含所有字段,其余部分   列设置为其默认值   值。如果你没有线   终止符,你应该将其设置为''。   在这种情况下,文本文件必须   包含每行的所有字段。

     

固定行格式也会影响处理   NULL值,如稍后所述。   注意固定大小的格式不会   如果你使用多字节工作   字符集

     
     

NULL处理

     

使用固定行格式(使用   当FIELDS TERMINATED BY和FIELDS时   ENCLOSED BY都是空的),NULL是   写成空字符串。注意   这会导致NULL值和空   表中的字符串   写入时无法区分   文件,因为两者都写为空   字符串。如果你需要能够   阅读时告诉两人分开   归档后,你不应该使用   固定行格式。

     
     

LOAD不支持某些情况   数据信息:

     
      
  • 固定大小的行(FIELDS TERMINATED BY和FIELDS ENCLOSED BY   两个都是空的)和BLOB或TEXT列。
  •   
     
     
      
  • 以下时无法使用用户变量   以固定行格式加载数据   因为用户变量没有   显示宽度。
  •   

答案 1 :(得分:1)

你可能不会非常喜欢它,但真的没有一种简单的方法可以做你想要的事情。很久以前(大约1991年),我编写了一个工具DBLDFMT(用于'数据库加载格式')来处理这种固定长度的非分隔文件。它被调整为生成Informix数据库首选的加载格式(因此它默认使用管道符号来分隔字段,但当然您可以使用命令行选项或环境变量来调整它)。但是,它可以创建分隔数据,然后可以使用LOAD DATA INFILE命令更正常地处理。

如果您需要DBLDFMT的源代码,请通过电子邮件与我联系(查看我的个人资料)。 (目前的版本,从2008年开始的3.17,没有直接支持CSV输出。添加它并不困难。你可以或多或少地达到所需的效果,但它应该比它容易得多。 )