Перейти к содержимому

Сервис обмена электронных валют

Партнерская программа Kredov

Парсинг txt файла построчно, поиск и выдача результата

#1 ChipFord.ru

ChipFord.ru
  • Пользователь
  • 4 сообщений
  • Репутация: 0
0

Отправлено 06 Октябрь 2015 - 23:00

Здравствуйте! нужна Ваша помощь:

Задача: необходимо разместить кнопку поиска запчастей на сайте, файл с запчастями находиться в корне сайта и имеет следующий вид:

 

ford.txt

 

0000006|4,46
0000323|3,25
0010214|277,52
0010636|683,46
0010699|305,88
0012104|305,88
0012172|0,41
0012173|0,41
0020847|608,51
...
 
вводим окно поиска номер запчасти( к примеру: 0000006) ниже выводится результат поиска (стоимость запчасти): 4,46 руб.
 
А если я хочу сделать вывод в виде таблицы, соответственно, добавляю в файле следующее:
 
0000006|4,46|2N11-15201-AB|Хомут
0000323|3,25
0010214|277,52
0010636|683,46
0010699|305,88
0012104|305,88ф
0012172|0,41
0012173|0,41
0020847|608,51
...
 
нажимаем на кнопку поиск, выводится таблица со следующим содержанием:
 
FINIS: 0000006 Инженерный номер: 2N11-15201-AB Описание: Хомут. Цена: 4,46 руб.
 
Помогите пожалуйста, с интеграцией данного кода на сайт. Спасибо

 

 

  • 0

#2 ChipFord.ru

ChipFord.ru
    Topic Starter
  • Пользователь
  • 4 сообщений
  • Репутация: 0

Отправлено 07 Октябрь 2015 - 01:24

<?
error_reporting(E_ALL & ~E_NOTICE);
define('COLUMN_SEPARATOR', '|');
$fileName = __DIR__ . DIRECTORY_SEPARATOR . 'ford.txt';
 
if ($_REQUEST['search']) {
    $arData = array();
    array_walk(file($fileName, FILE_IGNORE_NEW_LINES), function($arItem) use (&$arData) {
        $row = explode(COLUMN_SEPARATOR, $arItem);
        $arData[$row[0]] = $row;
    });
    $arResult = ($arData[$_REQUEST['number']]) ? $arData[$_REQUEST['number']] : false;
}
?>
<!DOCTYPE html>
<html lang="ru">
    <head> 
        <meta charset="utf-8">
        <style type="text/css">
            table { border-collapse: collapse; } 
            td { border: 1px solid black; padding: 3px; }
        </style>
    </head>
<body>
    <form action="">
        <input type="text" name="number" value="" />
        <input type="submit" name="search" value="Найти" />
    </form>
    <? if (isset($arResult)): ?>
        <? if (!$arResult): ?>
            Ничего не найдено
        <? elseif (count($arResult) <= 2): ?>
            Cтоимость запчасти: <?=$arResult[1]?> руб.
        <? else: ?>
            <table>
                <tr>
                    <td>FINIS: <?=$arResult[0]?></td>
                    <td>Инженерный номер: <?=$arResult[2]?></td>
                    <td>Описание: <?=$arResult[3]?></td>
                    <td>Цена: <?=$arResult[1]?></td>
                </tr>
            </table>
        <? endif ?>
    <? endif ?>
</body>

Разместил код на сайте:

http://www.chipford.ru/zap.php

 

Файл ford.txt положил в корень сайта:

http://www.chipford.ru/ford.txt

 

При поиске: 0000006

 

ничего не выдаёт(((

 

Подскажите пожалуйста куда копать, спасибо


  • 0

#3 ChipFord.ru

ChipFord.ru
    Topic Starter
  • Пользователь
  • 4 сообщений
  • Репутация: 0

Отправлено 07 Октябрь 2015 - 03:01

уменьшил файл до 10 строк, теперь пишет: ничего не найдено

 

Видимо файл большой, какой интересно лимит памяти...


  • 0

#4 ChipFord.ru

ChipFord.ru
    Topic Starter
  • Пользователь
  • 4 сообщений
  • Репутация: 0

Отправлено 07 Октябрь 2015 - 05:53

<?
error_reporting(E_ALL & ~E_NOTICE);
define('COLUMN_SEPARATOR', '|');
$fileName = __DIR__ . DIRECTORY_SEPARATOR . 'ford.txt';
 
if ($_REQUEST['search']) {
    $arResult = false;
    $firstLine = true;
    $handle = @fopen($fileName, "r");
    if ($handle) {
        while (($arItem = fgetcsv($handle, 4096, COLUMN_SEPARATOR)) !== false) {
            // fix file UTF-8 BOM
            if ($firstLine) {
                $arItem[0] = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $arItem[0]); 
                $firstLine = false;
            }
            
            if ($arItem[0] == $_REQUEST['number']) {
                $arResult = $arItem;
                break;
            }
        }
        fclose($handle);
    }
}
?>
<!DOCTYPE html>
<html lang="ru">
    <head> 
        <meta charset="utf-8">
        <style type="text/css">
            table { border-collapse: collapse; } 
            td { border: 1px solid black; padding: 3px; }
        </style>
    </head>
<body>
    <form action="">
        <input type="text" name="number" value="" />
        <input type="submit" name="search" value="Найти" />
    </form>
    <? if (isset($arResult)): ?>
        <? if (!$arResult): ?>
            Ничего не найдено
        <? elseif (count($arResult) <= 2): ?>
            Cтоимость запчасти: <?=$arResult[1]?> руб.
        <? else: ?>
            <table>
                <tr>
                    <td>FINIS: <?=$arResult[0]?></td>
                    <td>Инженерный номер: <?=$arResult[2]?></td>
                    <td>Описание: <?=$arResult[3]?></td>
                    <td>Цена: <?=$arResult[1]?></td>
                </tr>
            </table>
        <? endif ?>
    <? endif ?>
</body>
</html>

Это рабочий код.

 

 

У меня возникли ещё пару идей/вопросов.

Прайс-листы поставщик шлёт в текстовом формате с расширением .txt
содержимое файла: финис и цена без НДС

0101940|4902,91
0102056|1361,25
0102089|5464,43
0102121|2103,45
0102125|2103,45
0102306|6082,25
0115960|151,52
0116410|247,84
0120437|1210,93
...

прайсы обновляются как правило ежемесячно, хотя бывает и несколько раз в неделю
я сейчас начнут трудится добавлять: инженерный номер и описание
как бы мне сделать лучше, чтобы инженерный номер и описание каждый раз не добавлять, а каким то образом менять (заменять при импорте только колонку с ценами, тут тоже много подводных камней, а если к примеру добавится номер в середине текста, то цены и финис не будут совпадать...

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

+ как добавить НДС 18% к сумме

+ как можно добавить информацию в виде таблицы истории поиска запчастей: последние 10 запросов к примеру...

Спасибо


  • 0

#5 fedornabilkin

fedornabilkin
  • Пользователь
  • 696 сообщений
  • Репутация: 91

Отправлено 07 Октябрь 2015 - 07:19

Что бы решить все эти вопросы и еще те, которые будут возникать в будущем, надо использовать базу данных.

И добавлять сможешь, и редактировать, и изменять.

Достаточно просто будет сохранять историю поиска, также для конкретного юзера свою историю.

Думаю можно связаться с поставщиком и попросить, что бы прайсы высылал в xml


  • 0
Как часто в горестной разлуке,В моей блуждающей судьбе, ФО, я думал о тебе.


#6 miketomlin

miketomlin
  • Пользователь
  • 261 сообщений
  • Репутация: 35

Отправлено 07 Октябрь 2015 - 17:19

Поддержу. Переносите в базу. Скорость поиска наверняка увеличится, причем значительно. Можно и без xml. Во-первых, достаточно конвертеров. Во-вторых, можно в том же Экселе пересохранять в csv и импортировать в этом формате.


Из txt импорт тоже сделать не трудно. Только я не понял, как вы собираетесь определять значения доп. полей, которых нет в файле.


  • 0


Оформление форума – IPBSkins.ru