Запись данных из текстового файла в таблицу

Pegas

Новичок
Запись данных из текстового файла в таблицу

помогите написать функу для импорта данных из текстового файла в БД mysql. впоследствии будет рекурсивная выборка из базы.

есть файл следующего вида (количество полей может изменяться):

номер товара|уровень|наименование|наличие|цена1|цена2

100|1|МЕТАЛЛ
100|2|ТРУБА
100100|3|труба 1/2"|1|30.00|25.00
100200|3|труба 3/4"|0|18.00|15.00

в принципе я уже написал функу и она работает, единственно необходимо добавить формирование полей id и par_id для рекурсивного вывода:

function loadFile($usertable, $dbname, $file_db)
{
$file=file($_SERVER['DOCUMENT_ROOT'].$file_db);
$col=count($file);
$id=0;
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."';");
}
}
}
}
 

Tor

Новичок
php для этого не нужен
читай мануал к мускула на предмет
load data into file
 

Pegas

Новичок
закрыта функа на запись

-~{}~ 22.04.05 13:22:

да. точно. отказано хостером в привелегии FILE, поэтому LOAD DATA не подходит
 

Мутник

Новичок
Pegas

PHP:
$content = file_get_contents($path);
$list = explode("\r\n", $content);
$c = sizeof($list);

list($tmp["name"], $tmp["address"], $tmp["phone"], $tmp["email"], $tmp["url"], $tmp["country_id"], $tmp["comment"], $tmp["priority"]) = explode("|", $list[$i]);
А дальше пишешь несложненькую функцию, которая используя [m]implode[/m] легко сможет составить нужный тебе запрос, который ты в последствии и выполнишь.

Может это и не очень красиво, зато меня никогда не подводило.

P.S. обрати внимание на то, как у тебя строки разделены, какой именно разделитель. Не факт, что "\r\n";

P.P.S. и не забывай прослешить всякие там кавчки перед вставкой в БД.
 

Pegas

Новичок
все понятно. спасибА.
однако во-первых это также неудобно при измении количества полей, но не в этом суть. мне главное надо придумать как создать два поля: 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
 

untied

Сдвинутый новичок
Pegas, что ты имеешь в виду под рекурсивным выводом?
Ты б подробности своей загадошной задачи объяснил что ль?
А то спрашиваешь про то, как прочитать данные из файла и залить их в БД (для этого вполне подходит explode(), о чем я уже говорил), а теперь оказывается, что требуется рекурсивный вывод...

Представление об SQL имеем?
 

Pegas

Новичок
имеем представление, но не полное :)

короче был файлец такого вида:
уровень|номер товара|наименование|наличие|цена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."';");
        }
      }
    }
  }
Всем огромное спасибо за участие и помощь.
 

untied

Сдвинутый новичок
Pegas, тебе данные нужно в три таблицы вводить, а не в одну:
- таблица групп
- таблица подгрупп
- таблица материалов

Т.е. МЕТАЛЛ -- это группа, АРМАТУРА -- подгруппа группы МЕТАЛЛ, а Арматура 6 мм -- это материал в группе МЕТАЛЛ, подгруппе АРМАТУРА.

Соответственно, каждая запись в таблице групп должна иметь идентификатор. В таблице подгрупп каждая запись должна иметь свой идентификатор, а так же идентификатор группы. Каждая запись в таблице материалов -- свой собственный идентификатор, идентификатор группы, идентификатор подгруппы.

Преобразование из файла в базу делается достаточно тривиально.
 

Pegas

Новичок
ИМХО, аПсолютно не важно в каком количестве таблицы будут, да и создавать кучу таблиц нафик пока не впилось, потому что дерево групп достаточно вестистое на 2000 с лишним наименованияй и пока это будет лишняя путаница... посмотрим, может еще и вернусь этому, а пока важен результат.

ЗЫ. допустил ошиПку в коде:
PHP:
...
$query=mysql_query("UPDATE IGNORE ".$usertable." SET id='".$id."', id[B]p[/B]='".$idpar."', ".$colName[$key]."='".$value."';");
...
 
Сверху