【问题标题】:Complex fixed width import MYSQL复杂的定宽导入MYSQL
【发布时间】:2026-01-29 06:50:01
【问题描述】:

我有一些必须导入数据库的大文件。它们没有分隔符,因此宽度固定。问题是我希望将某些字段的平均值作为一列,并且仅来自不为 0 的字段。

示例文本(实际没有空格):

ASDD 000 000 003
BBBB 006 004 000
CCCC 001 002 000

我需要的结果插入是

ASDD | 3
BBBB | 5     [(6+4)/2]
CCCC | 1.5   [(1+2)/2]

现在我正在使用下一个代码,这显然是错误的。

LOAD DATA LOCAL
INFILE '{$file}'
INTO TABLE data
  (@var1)
    SET
    name=SUBSTR(@var1,1,4)
    avg=(SUBSTR(@var1,5,3)+SUBSTR(@var1,8,3)+SUBSTR(@var1,11,3))/3

生成下一个条目:

 ASDD | 1
 BBBB | 3.33
 CCCC | 1   

我的问题是,有什么方法可以正确使用 LOAD DATA LOCAL(或任何其他 SQL 直接),还是应该使用 php 代替?

PHP 的问题是实际文件有 9M 行、900 列和每行 10k 字符,我认为导入会很慢。

【问题讨论】:

  • 我喜欢人们尝试在 mysql 端编写代码... :-)

标签: mysql import fixed-width


【解决方案1】:
name=SUBSTR(@var1,1,4)
num = IF(SUBSTR(@var1,5,3)=0,0,1)+IF(SUBSTR(@var1,8,3)=0,0,1)+IF(SUBSTR(@var1,11,3)=0,0,1) 
avg=(SUBSTR(@var1,5,3)+SUBSTR(@var1,8,3)+SUBSTR(@var1,11,3))/num

【讨论】:

  • 这需要一个新的列'num',它也将被存储。对吗?
  • 为什么?它只是一个变量。如果你不需要它,你不能保留它
  • 试了一下,报错:无法识别列号。我猜是关于 LOAD LOCAL,它会自动插入 name、num 和 avg。