[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Парсер txt
linklink26
Значит у нас в организации человек специалист в 1с(7-ка), сделал выгрузку для сайта в формате txt (хотя я просил dbf ее можно было бы разобрать с dbase).

Ну txt так txt.

И вот задача распарсить файл в базу MySQL.

Файл весит окала 40мб. Т.е. не маленький.

Если парсить регуляркой не сильно ли долго будет парсить?

Если регуляркой не долго, то какую функцию выбрать?

Вот кусочек файла

КодТовара^Наименование^Поставщик^^^^^^Цена1^Цена2^Цена3^Валюта^Остаток^Аналог^КодИзКаталога^Упаковка ^InStock
4369-34^^3M+SJM^^экранированный кабел 30м^1^^^^^14788.22^0^0^0^0^руб.^от 3-х недель^^^1^0
546.40^^3M+SJM^^экранированный кабель^1^^^^^4362.01^0^0^0^0^руб.^от 3-х недель^^^1^0
334506^^3M+SJM^^Антистатический скотч, 6434,5м^1^^^^^349.03^0^0^0^0^руб.^от 3-х недель^^^0^0
3M430 15x25^^3M+SJM^^антистатические пакеты^1^^^^^231.9^0^0^0^0^руб.^от 3-х недель^^^100^0
3M-4444 30x40^^3M+SJM^^антистатические пакеты2^1^^^^^1293.77^0^0^0^0^руб.^от 3-х недель^^^100^0




Спустя 13 минут, 34 секунды (3.11.2010 - 17:55) Гость_Michael написал(а):
свои идеи хоть имеются? Попытки код написать?

Спустя 4 дня, 16 часов, 44 минуты, 5 секунд (8.11.2010 - 10:39) linklink26 написал(а):
Свои имеются, но зачем тогда этот форум?

$f_arr = file( "test.txt" );
$n_a = array();
for ($i=0; $i<count($f_arr); $i++) {
$n_a[$i] = explode("^", $f_arr[$i]);
}

var_dump($n_a);

Все прочитал.

Осталось понять как группировать поставщика, т.е. определять вложенность товаров в категорию. Ибо это экспорт из 1 с.

Спустя 12 минут, 11 секунд (8.11.2010 - 10:51) netruxa написал(а):
ну да тут explode тоже подойдет, хотя можно использовать preg_match_all

а поставщиков группировать можно создав массив и заносить туда чего надо. как я понял, это будет примерно так $group[$n_a[$i][2]]=... и тут какую инфу надо по товару

Спустя 1 час, 41 минута, 6 секунд (8.11.2010 - 12:32) SlavaFr написал(а):
а можно прямо во время чтения с файла получать масив.
http://de3.php.net/manual/en/function.fgetcsv.php

Спустя 1 час, 2 минуты, 48 секунд (8.11.2010 - 13:35) Sanchopansa написал(а):
тут какоето не сходство есть
КодТовара^Наименование^Поставщик^^^^^^Цена1^Цена2^Цена3^Валюта^Остаток^Аналог^КодИзКаталога^Упаковка ^InStock - 12 колонок
а тут
4369-34^^3M+SJM^^экранированный кабел 30м^1^^^^^14788.22^0^0^0^0^руб.^от 3-х недель^^^1^0 - 13 значений

и почему постаянно разное количество разделителей (^) или я как то не так разбиваю это все?

Спустя 1 час, 37 минут, 8 секунд (8.11.2010 - 15:12) linklink26 написал(а):
netruxa
Спасибо попробую покопать в эту сторону.

Sanchopansa
Сам в непонятках, мне этот импорт дал чел который типа шарит в 1с и делал тхт файл. Я его просил сделать нормально чтобы все было но он не умеет.. или не хочет. Буду его еще трясти.

Спустя 1 час, 37 минут, 21 секунда (8.11.2010 - 16:49) Sanchopansa написал(а):
Ну вообщето из 1С (на сколько я знаю, а я не силен в 1С) можно импортить вагоном вариантов... XLS, XML... и т.д. Работа с каторыми куда легче чем с этим что ты нам тут представил... Это я даже не знаю что такое.. ощущение что твой знакомый это руками бэкапил в файл smile.gif
Корочи зажимай ему яйца в двери и все будет гуд.. а незнает как то пускай идет к дяде Гоше

Спустя 1 день, 26 минут, 10 секунд (9.11.2010 - 17:15) linklink26 написал(а):
Sanchopansa )))))) ну это в 8-ке там xml а в 7-ке на dbf все, т.е либо dbf либо txt как он сказал. Но яйца еще зажму)))

Спустя 16 минут, 40 секунд (9.11.2010 - 17:32) Sanchopansa написал(а):
linklink26
Ясно.. спосибо за розъяснение.. буду знать.. smile.gif
А яйца зажать нада 100% все равно wink.gif

Спустя 1 месяц, 10 дней, 23 часа, 8 минут, 6 секунд (20.12.2010 - 16:40) linklink26 написал(а):
Вопрос решил с помощью этого скрипта

$file_name = $_GET['path'];

$conn = mysql_connect ("localhost", "username", "pass")
or die ("Соединение не установлено!");
@mysql_select_db("db_name") or die ("Соединение не установлено!");

if (($handle_f = fopen($file_name, "r")) !== FALSE)
{
// проверяется, надо ли продолжать импорт с определенного места
// если да, то указатель перемещается на это место

if(isset($_GET['ftell'])){
fseek($handle_f,$_GET['ftell']);
}
$i=0;
if(isset($_GET['x'])){
$x=$_GET['x'];
} else {
$x = 0;
}

// построчное считывание и анализ строк из файла
while ( ($data_f = fgetcsv($handle_f, 1000, ";"))!== FALSE) {
$insert_q = 'insert into temp1 (code,contract,price,amount,dat_time,is_op) values '.
' (\''.$data_f[0].'\',\''.$data_f[1].'\',\''.$data_f[2].'\',\''.$data_f[3].'\',\''.$data_f[4].'\',\'0\')';
@mysql_query($insert_q);

if(!strstr($i/5000,'.')){
print 'Importing record #: '.$x.'<br />';
flush();
ob_flush();
}

if($i==20000){
print '<meta http-equiv="Refresh" content="0; url='.$_SERVER['PHP_SELF'].'?x='.$x.'&ftell='.ftell($handle_f).'&path='.$_GET['path'].'">';
exit;
}
$x++;
$i++;

}

fclose($handle_f);
} else {$err = 1; echo "Не получилось открыть файл";}



И еще помогли коменты с этого блога http://parsing-and-i.blogspot.com/2010/05/csv-mysql.html


Всем тенкс.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.