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



Парсинг 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
  • Модератор
  • 1 181 сообщений
  • Репутация: 203

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

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

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

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

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


  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#6 miketomlin
miketomlin
  • Пользователь
  • 547 сообщений
  • Репутация: 115

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

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


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


  • 0




Похожие темы
  Название темы Автор Статистика Последнее сообщение

Пользователь месяца
BLIK BLIK 1-й за Ноябрь
Очков активности: 672 0 тем, 32 сообщения, 14 баллов репутации
ТОП самых активных за этот месяц
  • Фотография BLIK
    #1

    BLIK
    Очков активности: 63 Вне конкурса за определение пользователя месяца

  • Фотография Rodiola
    #2

    Rodiola (rukodelkovo.ru)
    Очков активности: 15 Вне конкурса за определение пользователя месяца

  • Фотография Victim
    #3

    Victim
    Очков активности: 15 0 тем, 5 сообщений, 2 балла репутации

  • Фотография kolver
    #4

    kolver
    Очков активности: 15 1 тема, 7 сообщений, 1 балл репутации

  • Фотография MattCutts
    #5

    MattCutts (dmitrylee.ru)
    Очков активности: 9 Вне конкурса за определение пользователя месяца

  • Фотография HITMAN84
    #6

    HITMAN84
    Очков активности: 7.5 1 тема, 2 сообщения, 1 балл репутации

  • Фотография iiccarus
    #7

    iiccarus
    Очков активности: 6 1 тема, 1 сообщение, 1 балл репутации

  • Фотография morvad24
    #8

    morvad24
    Очков активности: 6 1 тема, 1 сообщение, 1 балл репутации

  • Фотография TimurR
    #9

    TimurR
    Очков активности: 6 1 тема, 1 сообщение, 1 балл репутации

  • Фотография Vmir
    #10

    Vmir
    Очков активности: 6 0 тем, 2 сообщения, 2 балла репутации

  • Показать весь ТОП 10
Поддержите форум! =)
Апдейты
  • Яндекс ИКС: 29.11.2019
  • Яндекс выдача: 04.12.2019
Топ 5 участников по репутации

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