За последние 24 часа нас посетили 18030 программистов и 1653 робота. Сейчас ищут 1490 программистов ...

Вывод данных из CSV файла

Тема в разделе "Решения, алгоритмы", создана пользователем lexos, 7 дек 2012.

  1. lexos

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

    С нами с:
    17 фев 2012
    Сообщения:
    19
    Симпатии:
    0
    Может есть простой способ вывода на отдельную html страницу данных по запросу из xxx.csv файла
    Например содержимое файла:
    Код (Text):
    1. Директор;123-123-22;111;2222;;;
    2. Секретарь;333-123-22;222;1250;;;
    3. Охрана;222-123-22;333;500;;;
    Необходимо создать PHP запрос из html страницы на вывод данных из csv файла в html страницу в формате (примерно)
    Код (Text):
    1.  
    2. Должность: Секретарь
    3. Телефон: 333-123-22
    4. Кабинет: 222
    5. Табельный номер: 1250
    т.е. на html странице щелкаем по ссылке "Секретарь" и получаем новую страницу (как показано выше) заполненную из csv файла лежащего на сайте.

    Не судите строго, немного сумбурно описал, но что имею.... :)
     
  2. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    занеси данные в БД, так быстрее и надежней...да и проще...

    если нельзя, значит считываем каждую строку из файла, заносим в массив по разделителю ячейки и далее ищем в зависимости от того, но что кликнули на странице.
     
  3. lexos

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

    С нами с:
    17 фев 2012
    Сообщения:
    19
    Симпатии:
    0
    Не получается с БД. Вся БД на текстовых файлах, csv и dat.
    Считаь строку получается, занести в массив тоже, вывести предполагаю как. Всё упирается в то, как указать на html странице найти то, на что кликнул?
    Во, завернул...... :)
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    data.csv
    Код (Text):
    1. Директор;123-123-22;111;2222;;;
    2. Секретарь;333-123-22;222;1250;;;
    3. Охрана;222-123-22;333;500;;;
    list.php - вывод списка и ссылок на страницу с подробностями
    Код (PHP):
    1. <?php
    2. header('Content-Type: text/html; charset=utf-8');
    3. ?>
    4. <!DOCTYPE html>
    5. <html>
    6.     <head>
    7.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    8.         <title>Список</title>
    9.     </head>
    10.     <body>
    11. <?php
    12. $path = dirname(__FILE__);
    13. $fh = fopen($path . DIRECTORY_SEPARATOR . 'data.csv', 'r');
    14. while($row = fgetcsv($fh, 0, ';'))
    15.     echo('[url="detail.php?type=' . $row[0] . '"]' . $row[0] . '[/url]<br />');
    16. ?>
    17.     </body>
    18. </html>
    detail.php - страница с подробностями выбранной записи
    Код (PHP):
    1. <?php
    2. header('Content-Type: text/html; charset=utf-8');
    3. ?>
    4. <!DOCTYPE html>
    5. <html>
    6.     <head>
    7.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    8.         <title>Подробности</title>
    9.     </head>
    10.     <body>
    11. <?php
    12. $type = isset($_GET['type']) ? $_GET['type'] : '';
    13. $path = dirname(__FILE__);
    14. $fh = fopen($path . DIRECTORY_SEPARATOR . 'data.csv', 'r');
    15. $data = array();
    16. while($row = fgetcsv($fh, 0, ';')) {
    17.     if($row[0] === $type)
    18.         $data = $row;
    19. }
    20. if(count($data) > 0) {
    21. ?>
    22.         <table border="1">
    23.             <tr>
    24.                 <td>Должность</td>
    25.                 <td><?php echo($data[0]); ?></td>
    26.             </tr>
    27.             <tr>
    28.                 <td>Телефон</td>
    29.                 <td><?php echo($data[1]); ?></td>
    30.             </tr>
    31.             <tr>
    32.                 <td>Кабинет</td>
    33.                 <td><?php echo($data[2]); ?></td>
    34.             </tr>
    35.             <tr>
    36.                 <td>Табельный номер</td>
    37.                 <td><?php echo($data[3]); ?></td>
    38.             </tr>
    39.         </table>
    40.         [url="list.php"]Назад к списку[/url]
    41. <?php
    42. } else {
    43. ?>
    44.         По данному запросу ничего не найдено<br />
    45.         [url="list.php"]Назад к списку[/url]
    46. <?php
    47. }
    48. ?>
    49.     </body>
    50. </html>
    Подразумевается, что все 3 файла лежат в одной папке.
     
  5. lexos

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

    С нами с:
    17 фев 2012
    Сообщения:
    19
    Симпатии:
    0
    Возникла проблема с отображением.
    Если в CSV файле присутствуют строки в полях с началом такого содержимого (полностью строка):
    Код (Text):
    1. Сидоров Иван Петрович;Московская обл.;а/я 1234;ул.Мира д.1
    то при выводе будет (полностью строка):
    Код (Text):
    1.  
    2.  
    3. .
    4. /я 1234
    5. .Мира д.1
    т.е. Сидоров Иван Петрович - не отображается,
    Московская обл - не отображается, остается только точка
    в а/я1234 - первая буква а - не отображается
    в ул.Мира д.1 - ул - не отображается.

    Никак не могу понять почему так?
    Похоже, что проблема в том, что
    У меня используется <meta http-equiv="Content-Type" content="text/html; charset=Windows-1251">
    Там где начало фрагмента в поле имеет цифру или латинскую букву - там проблем нет.
    Но что делать дальше, не совсем понятно.
    При использовании explode этого небыло...
     
  6. lexos

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

    С нами с:
    17 фев 2012
    Сообщения:
    19
    Симпатии:
    0
    Выяснилось, однозначно проблема с "обрезанием" в настройках кодировки локали на сервере.
    Сменить настройки локали нет возможности
    По этому вопрос остается открытый - чем заменить fgetcsv ?

    Как вычислить номер строки, в файле с массивом, в которой найдена искомая комбинация ?
     
  7. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Попробуй в начале скрипта добавить строку
    Код (PHP):
    1. setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251'); 
     
  8. lexos

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

    С нами с:
    17 фев 2012
    Сообщения:
    19
    Симпатии:
    0
    Не помогло...
     
  9. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Нормальной замены для этой функции - нет. Нужно либо писать свой парсер CSV (который полюбому будет работать медленнее стандартной функции), либо добиваться работоспособности функции fgetcsv (устанавливать на сервере локаль ru_RU.cp1251 или переводить сайт на utf-8). Вариант с explode я лично рассматривать даже не стал бы вообще, поскольку так можно неправильно прочитать CSV.
     
  10. lexos

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

    С нами с:
    17 фев 2012
    Сообщения:
    19
    Симпатии:
    0
    Очень жаль.
    Самому писать парсер пока не позволяет количество извилин, а скорость работы не критична. Необходимо обработать массив с не более тысячью сток.
    Наверное придется искать решение с использованием explode, в моем случае вывод файла из 600 строк прошел без ошибок.
    Код (Text):
    1.  
    2. $type = isset($_POST['type']) ? $_POST['type'] : '';
    3. $type = strToUpper($type); /// перевод в верхний гегистр
    4. /// ??????? как подключить поиск
    5. /// ??????? по полученному $type
    6.  
    7. $call= file("http://www.domen.ru/call.csv"); /// Считывание файла
    8. $numstrok = count ($call); /// Подсчитываем кол-во строк в файле
    9. for ($icb=0; $icb<$numstrok; $icb++) /// выводим все строки в цикле
    10. {
    11. /// Разбиение строки
    12. $cbpos = explode( ";",$call[$icb] );
    13. print "
    14. <br>$cbpos[3]
    15. <br>$cbpos[0]
    16. <br>$cbpos[1]
    17. <br>$cbpos[2]
    18. <br>**********";
    19. }}
    Здесь с отображением всё нормально.
    Осталось включить поиск и вывод найденной строки.
     
  11. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Просто стоит учесть, что сами данные - могут содержать символ ";" или символ перевода строки. И если попадётся такая строка - то обработается неверно.
     
  12. lexos

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

    С нами с:
    17 фев 2012
    Сообщения:
    19
    Симпатии:
    0
    В моем случае это исключено. Вероятность не нулевая, но о-о-очень близкая к нулю.
     
  13. MaXyC_Web_Studio

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

    С нами с:
    31 дек 2006
    Сообщения:
    678
    Симпатии:
    3
    Адрес:
    Новоуральск
    PHP:
    1. foreach(file('db.csv') as $line){
    2. $row[] = explode(';', $line);
    3. }
     
  14. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    MaXyC_Web_Studio
    Выше я написал, почему так делать не стоит.
     
  15. MaXyC_Web_Studio

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

    С нами с:
    31 дек 2006
    Сообщения:
    678
    Симпатии:
    3
    Адрес:
    Новоуральск