2015-05-06 4 views
0

У меня есть огромные файлы, которые мне нужно импортировать в БД. У них нет разделителей, поэтому фиксированная ширина. Дело в том, что я хотел бы иметь СРЕДНЕЕ некоторых полей в одном столбце, и только от тех, которые не являются 0.Импорт фиксированной ширины MYSQL

Пример текста (без пробелов в реальном):

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 istead ?

Проблема с PHP заключается в том, что реальные файлы имеют как 9M строк, 900 столбцов и 10k символов в строке, и я думаю, что импорт будет довольно медленным.

+0

Мне нравится, когда люди пытаются код на тузде стороны ... :-) – Alex

ответ

0
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 
+0

Это требует нового столбец «Num», который также будет сохранен. Это правильно? – user3725565

+0

Почему? это просто переменная. если вам это не нужно, вы не можете его оставить – Alex

+0

попробовал и получил ошибку: Не удалось идентифицировать номер столбца. Я предполагаю, что это касается LOAD LOCAL, который автоматически вставляет имя, num и avg. – user3725565

Смежные вопросы