За последние 24 часа нас посетили 22904 программиста и 1241 робот. Сейчас ищут 748 программистов ...

Нужно написать скрипт.

Тема в разделе "PHP Free-Lance", создана пользователем Realman, 27 окт 2009.

  1. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    +1 =)
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Simpliest
    Не, я не так пишу. Я пишу не максимально компактно и аскетично, а чтобы выглядело человечно
    PHP:
    1. <?php
    2. class parse
    3. {
    4.         const POSTOYANNAYA = 'content|||';
    5.         private $files = array();
    6.         private $beginfrom = array(1 => null, 2 => null, 3 => null, 4 => null);
    7.         private $errors = array();
    8.         private $result = array();
    9.         public $rname = null;
    10.         public function loadFile($fname)
    11.         {
    12.                 if (is_readable($fname))
    13.                 {
    14.                         array_push($this -> files, file($fname, FILE_IGNORE_NEW_LINES));
    15.                 }
    16.                 else
    17.                 {
    18.                         $this -> errors[] = 'File "'.$fname.'" is a not readable.';
    19.                 }
    20.         }
    21.         public function setRname($name)
    22.         {
    23.                 if (empty($name))
    24.                 {
    25.                         $this -> errors[] = 'Incorrect name for result file.';
    26.                 }
    27.                 else
    28.                 {
    29.                         $this -> rname = $name;
    30.                 }
    31.         }
    32.         public function setBegin($fnum, $val)
    33.         {
    34.                 if (!is_numeric($val))
    35.                 {
    36.                         $this -> errors[] = 'Inccorect line number at file #'.$fnum.'.';
    37.                 }
    38.                 elseif (count($this -> files[$fnum]) < $val)
    39.                 {
    40.                         $this -> errors[] = 'Line #'.$val.' not found in the file #'.$fnum.'.';
    41.                 }
    42.                 else
    43.                 {
    44.                         $this -> beginfrom[$fnum] = $val;
    45.                 }
    46.         }
    47.         public function run()
    48.         {
    49.                 if (!empty($this -> errors))
    50.                 {
    51.                         echo "<pre>Errors:\r\n";
    52.                         print_r($this -> errors);
    53.                         echo '</pre>';
    54.                         return 0;
    55.                 }
    56.                 else
    57.                 {
    58.                         end($this -> files[0]);
    59.                         end($this -> files[1]);
    60.                         end($this -> files[2]);
    61.                         $last0 = key($this -> files[0]);
    62.                         $last1 = key($this -> files[1]);
    63.                         $last2 = key($this -> files[2]);
    64.                         $this -> begin(0);
    65.                         $this -> begin(1);
    66.                         $this -> begin(2);
    67.                         reset($this -> files[3]);
    68.                         foreach($this -> files[3] as $string)
    69.                         {
    70.                                 $buffer = null;
    71.                                 $curr0 = current($this -> files[0]);
    72.                                 $curr1 = current($this -> files[1]);
    73.                                 $curr2 = current($this -> files[2]);
    74.                                 $buffer = $curr0.'|'.$curr1.'|'.$curr2.'|'.self::POSTOYANNAYA.'|'.$string.'|http://'.$string;
    75.                                 if (key($this -> files[0]) == $last0)
    76.                                 {
    77.                                         $this -> begin(0);
    78.                                 }
    79.                                 if (key($this -> files[1]) == $last1)
    80.                                 {
    81.                                         $this -> begin(1);
    82.                                 }
    83.                                 if (key($this -> files[2]) == $last2)
    84.                                 {
    85.                                         $this -> begin(2);
    86.                                 }
    87.                                 next($this -> files[0]);
    88.                                 next($this -> files[1]);
    89.                                 next($this -> files[2]);
    90.                                 array_push($this -> result, $buffer);
    91.                         }
    92.                         echo '<b>Result file: <a href="'.$this -> rname.'" target="_blank">'.$this -> rname.'</a></b>';
    93.                         $this -> save();
    94.                 }
    95.         }
    96.         private function begin($num)
    97.         {
    98.                 reset($this -> files[$num]);
    99.                 for($i = 1; $i < $this -> beginfrom[$num]; $i++)
    100.                 {
    101.                         next($this -> files[$num]);
    102.                 }
    103.         }
    104.         private function save()
    105.         {
    106.                 file_put_contents($this -> rname, implode("\r\n", $this -> result));
    107.         }
    108. }
    109.  
    110. $parser = new parse;
    111. ?>
    112. <html>
    113. <title>Parse files</title>
    114. <body>
    115. <form method="POST" action ="<?php echo $_SERVER['PHP_SELF']; ?>">
    116. <table>
    117. <tr>
    118. <td>Первый файл:</td><td><input name="file1" value="1.txt"></td><td>Cо строки:</td><td><input name="begin1" value="1"></td>
    119. </tr>
    120. <tr>
    121. <td>Второй файл:</td><td><input name="file2" value="2.txt"></td><td>Cо строки:</td><td><input name="begin2" value="1"></td>
    122. </tr>
    123. <tr>
    124. <td>Третий файл:</td><td><input name="file3" value="3.txt"></td><td>Cо строки:</td><td><input name="begin3" value="1"></td>
    125. </tr>
    126. <tr>
    127. <td>Четвертый файл:</td><td><input name="file4" value="4.txt"></td>
    128. </tr>
    129. <tr>
    130. <td>Сохранить в:</td><td><input name="rname" value="result.txt"></td>
    131. </tr>
    132. <tr>
    133. <td>
    134. <input type="submit" name="go" value="Start">
    135. </td>
    136. </tr>
    137. </table>
    138. <?php
    139. if (isset($_POST['go']))
    140. {
    141.         $parser -> loadFile($_POST['file1']);
    142.         $parser -> loadFile($_POST['file2']);
    143.         $parser -> loadFile($_POST['file3']);
    144.         $parser -> loadFile($_POST['file4']);
    145.         $parser -> setBegin(0, $_POST['begin1']);
    146.         $parser -> setBegin(1, $_POST['begin2']);
    147.         $parser -> setBegin(2, $_POST['begin3']);
    148.         $parser -> setRname($_POST['rname']);
    149.         $parser -> run();
    150. }
    151. ?>
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    ...и чтобы в процессе написания не по коду туда сюда не бегать - например метод save который состоит из одной функции. Чтобы не думать на этом месте, что нужно будет сделать при сохранении. Пишу по-ходу исполнения так сказать.
     
  4. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    [vs]
    Ты меня убил :(

    Это хорошо и замечательно, когда ты делаешь CMS или компонент, или там еще что-то...
    Но для простого утилитного скрипта...

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

    Я сам часто спотыкаюсь на чрезмерном усложнении простых вещей... Но ты меня превзошел...

    P.S. ты обещал код не показывать, пока не оплатят.
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Оплатили.
     
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Ну вот и сравни читабельность двух подходов.

    Оккама на вас не хватает...

    Надо, пожалуй, запретить читать Фаулера без прочтения Оккама.
     
  7. Realman

    Realman Активный пользователь

    С нами с:
    6 авг 2009
    Сообщения:
    26
    Симпатии:
    0
    Комрады программисты, если не спиться можете помочь) А то VS спать завалился)

    1) Дело такое, не чередуется почему то, ну то есть например в первом файле всего две строчки так он вписывает первую, и потом вторую,вторую,вторую и так во всех файлах то есть заканчивается например в третьем файле строчки а скрипт еще работает, так он вписывает последнюю на которой строчки кончились, думаю понятно^^ Можете подправить чтобы если строчки заканчиваются возвращалось на 1 строчку (в файле) и по порядку шло и если опять доходило до конца опять на первую и поехали)

    Есть 5$ понимаю что мелочь, но больше нет)

    И П.С.Ы Есть у когонить скрипт, который генерировал бы строчки вида:
    Моеназвание000
    Моеназвание001
    Моеназвание002

    И тд..
     
  8. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    у кого-то в этой тепе php головного мозга =)
     
  9. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Realman
    Число строк в первых 3х файлах у тебя одинаково?

    Если да, то возьми мой код, забей имена файлов
    вместо CONST в 28й строке вбей нужный тебе постоянный текст.

    А как vs появится, так и будешь с ним разбираться с его скриптом.

    PHP:
    1.  
    2. <form action="" method="post">
    3.     <input type="text" name="start">
    4.     <input type="submit" name="submit">
    5. </form>
    6. <?php
    7. error_reporting(E_ALL | E_STRICT);
    8. $fn1 = '1.txt';
    9. $fn2 = '2.txt';
    10. $fn3 = '3.txt';
    11. $fn4 = '4.txt';
    12.  
    13. if (isset($_POST['submit'])) {
    14.     $start = abs((int) $_POST['start']);
    15.  
    16.     $fa1 = file($fn1,FILE_IGNORE_NEW_LINES);
    17.     $fa2 = file($fn2,FILE_IGNORE_NEW_LINES);
    18.     $fa3 = file($fn3,FILE_IGNORE_NEW_LINES);
    19.     $fa4 = file($fn4,FILE_IGNORE_NEW_LINES);
    20.     $c = count($fa1);
    21.     if ($c != count($fa2) || $c != count($fa3)) {
    22.         die('Число строк в файлах 1,2,3 не совпадает');
    23.     }
    24.     if ($start > $c || $start == 0) {
    25.         $start=1;
    26.     }
    27.     $res = array();
    28.     foreach ($fa4 as $val) {
    29.         $res[] = $fa1[$start-1] . '|' . $fa2[$start-1] . '|' . $fa3[$start-1] . '|CONST||||' . $val . '|http://' . $val;
    30.         $start++;
    31.         if ($start > $c) {
    32.             $start=1;
    33.         }
    34.     }
    35.     file_put_contents('result.txt',implode("\r\n", $res));
    36. }
    37.  
    38. die();
     
  10. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Такие вещи не хранят обычно.

    Это пишется за пару минут.
     
  11. Realman

    Realman Активный пользователь

    С нами с:
    6 авг 2009
    Сообщения:
    26
    Симпатии:
    0
    К сожалению нет, В первом пока 2 (может потом еще добавлю) , во втором около 2500 и в третьем около 300.
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Мда, переводил указатель массива вперед даже если элемент был последним - неправильно.
    Правильный код:
    PHP:
    1. <?php
    2. class parse
    3. {
    4.         const POSTOYANNAYA = 'adult_ru|||';
    5.         private $files = array();
    6.         private $beginfrom = array(1 => null, 2 => null, 3 => null, 4 => null);
    7.         private $errors = array();
    8.         private $result = array();
    9.         public $rname = null;
    10.         public function loadFile($fname)
    11.         {
    12.                 if (is_readable($fname))
    13.                 {
    14.                         array_push($this -> files, file($fname, FILE_IGNORE_NEW_LINES));
    15.                 }
    16.                 else
    17.                 {
    18.                         $this -> errors[] = 'File "'.$fname.'" is a not readable.';
    19.                 }
    20.         }
    21.         public function setRname($name)
    22.         {
    23.                 if (empty($name))
    24.                 {
    25.                         $this -> errors[] = 'Incorrect name for result file.';
    26.                 }
    27.                 else
    28.                 {
    29.                         $this -> rname = $name;
    30.                 }
    31.         }
    32.         public function setBegin($fnum, $val)
    33.         {
    34.                 if (!is_numeric($val))
    35.                 {
    36.                         $this -> errors[] = 'Inccorect line number at file #'.$fnum.'.';
    37.                 }
    38.                 elseif (count($this -> files[$fnum]) < $val)
    39.                 {
    40.                         $this -> errors[] = 'Line #'.$val.' not found in the file #'.$fnum.'.';
    41.                 }
    42.                 else
    43.                 {
    44.                         $this -> beginfrom[$fnum] = $val;
    45.                 }
    46.         }
    47.         public function run()
    48.         {
    49.                 if (!empty($this -> errors))
    50.                 {
    51.                         echo "<pre>Errors:\r\n";
    52.                         print_r($this -> errors);
    53.                         echo '</pre>';
    54.                         return 0;
    55.                 }
    56.                 else
    57.                 {
    58.                         end($this -> files[0]);
    59.                         end($this -> files[1]);
    60.                         end($this -> files[2]);
    61.                         $last0 = key($this -> files[0]);
    62.                         $last1 = key($this -> files[1]);
    63.                         $last2 = key($this -> files[2]);
    64.                         $this -> begin(0);
    65.                         $this -> begin(1);
    66.                         $this -> begin(2);
    67.                         reset($this -> files[3]);
    68.                         foreach($this -> files[3] as $string)
    69.                         {
    70.                                 $buffer = null;
    71.                                 $curr0 = current($this -> files[0]);
    72.                                 $curr1 = current($this -> files[1]);
    73.                                 $curr2 = current($this -> files[2]);
    74.                                 $buffer = $curr0.'|'.$curr1.'|'.$curr2.'|'.self::POSTOYANNAYA.'|'.$string.'|http://'.$string;
    75.                                 if (key($this -> files[0]) === $last0)
    76.                                 {
    77.                                         $this -> begin(0);
    78.                                 }
    79.                                 else
    80.                                 {
    81.                                         next($this -> files[0]);
    82.                                 }      
    83.                                 if (key($this -> files[1]) === $last1)
    84.                                 {
    85.                                         $this -> begin(1);
    86.                                 }
    87.                                 else
    88.                                 {
    89.                                         next($this -> files[1]);
    90.                                 }
    91.                                 if (key($this -> files[2]) === $last2)
    92.                                 {
    93.                                         $this -> begin(2);
    94.                                 }
    95.                                 else
    96.                                 {
    97.                                         next($this -> files[2]);
    98.                                 }
    99.                                 array_push($this -> result, $buffer);
    100.                         }
    101.                         echo '<b>Result file: <a href="'.$this -> rname.'" target="_blank">'.$this -> rname.'</a></b>';
    102.                         $this -> save();
    103.                 }
    104.         }
    105.         private function begin($num)
    106.         {
    107.                 reset($this -> files[$num]);
    108.                 for($i = 1; $i < $this -> beginfrom[$num]; $i++)
    109.                 {
    110.                         next($this -> files[$num]);
    111.                 }
    112.         }
    113.         private function save()
    114.         {
    115.                 file_put_contents($this -> rname, implode("\r\n", $this -> result));
    116.         }
    117. }
    118.  
    119. $parser = new parse;
    120. ?>
    121. <html>
    122. <title>Parse files</title>
    123. <body>
    124. <form method="POST" action ="<?php echo $_SERVER['PHP_SELF']; ?>">
    125. <table>
    126. <tr>
    127. <td>Первый файл:</td><td><input name="file1" value="1.txt"></td><td>Cо строки:</td><td><input name="begin1" value="1"></td>
    128. </tr>
    129. <tr>
    130. <td>Второй файл:</td><td><input name="file2" value="2.txt"></td><td>Cо строки:</td><td><input name="begin2" value="1"></td>
    131. </tr>
    132. <tr>
    133. <td>Третий файл:</td><td><input name="file3" value="3.txt"></td><td>Cо строки:</td><td><input name="begin3" value="1"></td>
    134. </tr>
    135. <tr>
    136. <td>Четвертый файл:</td><td><input name="file4" value="4.txt"></td>
    137. </tr>
    138. <tr>
    139. <td>Сохранить в:</td><td><input name="rname" value="result.txt"></td>
    140. </tr>
    141. <tr>
    142. <td>
    143. <input type="submit" name="go" value="Start">
    144. </td>
    145. </tr>
    146. </table>
    147. <?php
    148. if (isset($_POST['go']))
    149. {
    150.         $parser -> loadFile($_POST['file1']);
    151.         $parser -> loadFile($_POST['file2']);
    152.         $parser -> loadFile($_POST['file3']);
    153.         $parser -> loadFile($_POST['file4']);
    154.         $parser -> setBegin(0, $_POST['begin1']);
    155.         $parser -> setBegin(1, $_POST['begin2']);
    156.         $parser -> setBegin(2, $_POST['begin3']);
    157.         $parser -> setRname($_POST['rname']);
    158.         $parser -> run();
    159. }
    160. ?>
     
  13. Realman

    Realman Активный пользователь

    С нами с:
    6 авг 2009
    Сообщения:
    26
    Симпатии:
    0
    Чего то помойму не хватает)
     
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    С номерами строк скопировал?
    Скачай http://83.234.82.170/parse.rar
     
  15. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    А номера копируются? О.о
     
  16. Realman

    Realman Активный пользователь

    С нами с:
    6 авг 2009
    Сообщения:
    26
    Симпатии:
    0
    Я как то умудрился)

    Вроде все ок, только вот сделать бы чтобы не на указанную в начале строчку возвращался если заканчивается, а на первую срочку в файле)
     
  17. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    встроки вида $this -> begin(цифра);
    под номером 77,85,93

    заменить на

    reset($this -> files[цифра])
     
  18. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Вроде файрфокс копирует.
    o.0
    замени на
    Upd. Опоздал)
     
  19. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    [vs]
    Я тебе говорил :) Не усложняй сверх необходимого.
     
  20. Realman

    Realman Активный пользователь

    С нами с:
    6 авг 2009
    Сообщения:
    26
    Симпатии:
    0
    Осталась одна проблемка) Файлы пофиг руками посижу составлю)

    Открываю результат в firefoxe, ишаке и нотепадом везде результат один и тот же строчки сбиваются, то есть вид такой:

    one1
    |Content8
    |kluch9
    |adult_ru||||qwe
    |http://qwe

    one1
    |Content8
    |kluch9
    |adult_ru||||qwe
    |http://qwe

    а не как надо:
    one1|Content8|kluch9|adult_ru||||qwe|http://qwe
    one1|Content8|kluch9|adult_ru||||qwe|http://qwe
     
  21. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Эээ .. сообщение выше прочитал такую фигню, решил её наговнокодить:

    PHP:
    1. <?php
    2.  
    3. // Постоянное количество цифр
    4. $idiot['const'] = 3;
    5. // Количество результатирующих строк
    6. $idiot['strings'] = 100;
    7.  
    8.  
    9. // Обработка
    10. $result = array();
    11.  
    12. for($j = 0; $j < $idiot['strings']; $j++) {
    13.     if(strlen($j) < $idiot['const']) {
    14.         $result[$j] = str_repeat('0', $idiot['const'] - strlen($j+1));
    15.     }
    16.    
    17.     isset($result[$j]) ? $result[$j] .= $j+1 : $result[$j] = $j+1;
    18. }
    19.  
    20. // Вывести результат строкой
    21. echo implode('<br />', $result);
    22.  
    23. ?>
     
  22. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Realman
    Ммм, быть такого не должно.

    Apple
    Ты префикс имени файла забыл добавить.
     
  23. Realman

    Realman Активный пользователь

    С нами с:
    6 авг 2009
    Сообщения:
    26
    Симпатии:
    0
    Apple, Спасибо большое, только куда там вписать моеназвание?)
     
  24. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    в 14ю строку
    = "Моеназвание" . тут все что после равно.
     
  25. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Воо, пофиксил:

    PHP:
    1. <?php
    2.  
    3. // Постоянное количество цифр
    4. $idiot['const'] = 3;
    5. // Количество результатирующих строк
    6. $idiot['strings'] = 100;
    7. // Префикс
    8. $idiot['text'] = 'PREFIX__';
    9.  
    10.  
    11. // Обработка
    12. $result = array();
    13.  
    14. for($j = 0; $j < $idiot['strings']; $j++) {
    15.     $result[$j] = $idiot['text'];
    16.    
    17.     if(strlen($j) < $idiot['const']) {
    18.         $result[$j] .= str_repeat('0', $idiot['const'] - strlen($j+1)).($j+1);
    19.     } else $result[$j] .= $j+1;
    20. }
    21.  
    22. // Вывести результат строкой
    23. echo implode('<br />', $result);
    24.  
    25. ?>