
| Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
![]() |
||
txt->mysql обработка полей
|
||
| Философия, технологии, алгоритмы! |
![]() |
|
|
Опции темы |
|
|
#1 |
|
Форумец
Сообщений: 6,803
Регистрация: 10.06.2004
Возраст: 44
|
txt->mysql обработка полей
есть текстовый файл с полями следующего вида:
труба|1/2"; 3/4"|12|50.00 Вопрос! Как прописать FIELDS, чтобы обрабатывалось поля такого вида, вот такая функа чего-то не пашет: function list_file($file_db, $usertable) { $path=$_SERVER['DOCUMENT_ROOT'].$file_db; $result=mysql_query("LOAD DATA INFILE '$path' INTO TABLE $usertable FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\n' (text1, text2, text3, text4);"); } ЗЫ. Если бы не эти дюймы, то такая функа работала бы: function list_file($file_db, $usertable) { $path=$_SERVER['DOCUMENT_ROOT'].$file_db; $result=mysql_query("LOAD DATA INFILE '$path' INTO TABLE $usertable FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '' LINES TERMINATED BY '\n' (text1, text2, text3, text4);"); } Заранее благодарен за помощь. |
|
|
|
|
#5 |
|
форумецъ
Сообщений: 995
Регистрация: 15.06.2002
Возраст: 45
|
дык читай файл не fopen а file... т.е. целиком.
у меня файл на 20 мегов парсится(regex) и перегоняется в базу меньше чем за минуту. |
|
|
|
|
#9 |
|
Форумец
Сообщений: 6,803
Регистрация: 10.06.2004
Возраст: 44
|
Тему открываю, но теперь другой вопрос:
надо придумать как создать дополнительно два поля: id и par_id для рекурсивного вывода, а то голову уже поломал... ![]() есть файл следующего вида (количество полей может изменяться): id|par_id|номер товара|уровень|наименование|наличие|цена1|цена2 1|1|100|1|МЕТАЛЛ 2|1|100000|2|ТРУБА 3|2|100100|3|труба 1/2"|1|30.00|25.00 4|2|100200|3|труба 3/4"|0|18.00|15.00 5|2|200000|2|ЛИСТ 6|5|200100|3|лист|1|32.00|5.00 Вот работающая функа, тока без создания двух доп. полей id и par_id function loadFile($usertable, $dbname, $file_db) { $file=file($_SERVER['DOCUMENT_ROOT'].$file_db); $col=count($file); $id=1; while (list($k, $v)=each($file)) { $line=explode('|', $v); $m=0; foreach($line as $key=>$value) { switch ($key) { case 0: $colName[$key]='idprod'; break; case 1: $colName[$key]='level'; break; case 2: $colName[$key]='text1'; break; case 3: $colName[$key]='text2'; break; case 4: $colName[$key]='text3'; break; case 5: $colName[$key]='text4'; break; } if ($m==0) { $query=mysql_query("INSERT IGNORE INTO $usertable (id, ".$colName[$key].") VALUES ('".$id++."', '".$value."');"); $m=1; } else $query=mysql_query("UPDATE IGNORE ".$usertable." SET id='".$id."', ".$colName[$key]."='".$value."';"); } } } |
|
|
|
|
#10 |
|
Форумец
Сообщений: 6,803
Регистрация: 10.06.2004
Возраст: 44
|
Решил самостоятельно
короче был файлец такого вида:
уровень|номер товара|наименование|наличие|цена1|цена2 1|100|МЕТАЛЛ 2|100000|АРМАТУРА 3|100100|Арматура 6 мм|1|23844.00|19870.00 3|100200|Арматура 8 мм|1|23064.00|19220.00 3|100300|Арматура 10 мм|1|21300.00|17750.00 2|200000|БАЛКА 3|200100|Балка №10|0|10800.00|9000.00 3|200200|Балка №12|1|22860.00|19050.00 3|200300|Балка №12 Б1|1|22500.00|18750.00 а надо было сделать такого: id|par_id|уровень|номер товара|наименование|наличие|цена1|цена2 1|1|1|100|МЕТАЛЛ 2|1|2|100000|АРМАТУРА 3|2|3|100100|Арматура 6 мм|1|23844.00|19870.00 4|2|3|100200|Арматура 8 мм|1|23064.00|19220.00 5|2|3|100300|Арматура 10 мм|1|21300.00|17750.00 6|1|2|200000|БАЛКА 7|6|3|200100|Балка №10|0|10800.00|9000.00 8|6|3|200200|Балка №12|1|22860.00|19050.00 9|6|3|200300|Балка №12 Б1|1|22500.00|18750.00 т.е. добавить 2 столбца с идентификаторами уровня вложенности, по которым в дальнейшем при рекусивной выборке из базы будут браться данные. вопрос решил самостоятельно... кому интересно вот код... правда он получился так сказать не очень удобоваримым... может кто посоветует как упростить? [PHP] function loadFile($usertable, $dbname, $file_db) { $file=file($_SERVER['DOCUMENT_ROOT'].$file_db); $col=count($file); $id=0; $idp=array(0=>0, 1=>0); $level=1; $levelNew=1; $idpar=0; while (list($k, $v)=each($file)) { $line=explode('|', $v); $m=0; foreach($line as $key=>$value) { switch ($key) { case 0: $colName[$key]='level'; break; case 1: $colName[$key]='idprod'; break; case 2: $colName[$key]='text1'; break; case 3: $colName[$key]='text2'; break; case 4: $colName[$key]='text3'; break; case 5: $colName[$key]='text4'; break; } if ($m==0) $id++; if ($colName[$key]=='level') $levelNew=$value; if ($level<$levelNew) { $level=$levelNew; if ($id>1) { $idp[$levelNew]=$id-1; $idpar=$idp[$levelNew]; } else { $idp[$levelNew]=$id; $idpar=$idp[$levelNew]; } } if ($level>=$levelNew) { $level=$levelNew; if ($idp[$levelNew]==0) $idp[$levelNew]=1; $idpar=$idp[$levelNew]; } if ($m==0) { $query=mysql_query("INSERT IGNORE INTO $usertable (id, idp, ".$colName[$key].") VALUES ('".$id."', '".$idpar."', '".$value."');"); $m=1; } else $query=mysql_query("UPDATE IGNORE ".$usertable." SET id='".$id."', id='".$idpar."', ".$colName[$key]."='".$value."';"); } } } } [/PHP] Всем огромное спасибо за участие и помощь. :idolater: |
|
|
|
|
#11 | |
|
фотограф
Сообщений: 2,738
Регистрация: 20.10.2004
|
Сережа, вот код функции, которая рекурсивно собирает все данные из таблицы базы и возвращает их в виде удобного массива, где 0-элемент данные о самом разделе.
Цитата:
|
|
|
|