Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PHP поиск по CSV файлу. Нужно произвести поиск по CSV 
:(
    Опции темы
WebCob
  Дата 4.8.2004, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 4.8.2004

Репутация: нет
Всего: нет



Суть заключается в том, что есть CSV файл содержащий поля A;B;C;D;E;F
Поля A и В числовые. А это начало диапазона, В это конец диапазона.
Поиск производится только по диапазону. В случае, если введенное число соответствует одному из диапазонов, то нужно вывести на print поля C;D;E;F именно той строки в которой было найдено число Э диапазону.
PM MAIL   Вверх
Ignat
Дата 4.8.2004, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 10
Всего: 73



И какие проблемы?
Код
$number=5; //число
$lines=file("file.csv");
foreach ($lines as $line_num => $line) {
  $nums=explode(";",$line);
  ($nums[0]<$number&&$nums[1]>$number)?echo $line:"";
}



--------------------
Теперь при чем :P
PM   Вверх
IZ@TOP
Дата 4.8.2004, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Ignat
Зачем такой изврат с foreach??? Мне кажется что эту конструкцию в данном случае лучше заменить на for.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Ignat
Дата 4.8.2004, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 10
Всего: 73



А чччёрт его знает, мне почему-то больше foreach нравится, можно еще while сделать, кстати, пример из мануала smile.gif


--------------------
Теперь при чем :P
PM   Вверх
IZ@TOP
Дата 4.8.2004, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Ignat
Про мануал то понятно. Просто работа цикла foreach по понятным соображениям в несколько раз медленее чем for.

PS Правила улучшения производительности, часть 1.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Ignat
Дата 5.8.2004, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 10
Всего: 73



Уговорил:
Код
$number=5; //число
$lines=file("file.csv");
for($i=0;$i<count($lines);$i++){
 $nums=explode(";",$lines[$i]);
 ($nums[0]<$number&&$nums[1]>$number)?echo $lines[$i]:"";
}


Это сообщение отредактировал(а) Ignat - 5.8.2004, 08:57


--------------------
Теперь при чем :P
PM   Вверх
WebCob
Дата 5.8.2004, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 4.8.2004

Репутация: нет
Всего: нет



У меня это получилось так:
$massive = file("test1.csv", "r");
$count_data = count($massive);
for($i=0; $i<$count_data; $i++)
$data = explode(";", $massive[$i]);
$index_no[$i] = $data[0];
$begin_count[$i] = $data[1];
$end_count[$i] = $data[2];
$start_action[$i] = $data[3];
$end_action[$i] = $data[4];
$info_action[$i] = $data[5];
$data[1] = array($begin_count[$i]);
$data[2] = array($end_count[$i]);
$data_count = count($begin_count);
while (--$data_count+1)
if ($begin_count[$data_count] <= $int_no and $int_no <= $end_count[$data_count])
Но работать не хочет. По умолчанию выводит информацию из последней строки полей C;D;E;F
Все заганяется в массив, потом индексируется. А вот дальше я не соображаю как сделать...

PM MAIL   Вверх
Ignat
Дата 5.8.2004, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 10
Всего: 73



Ничего у тебя в массив не загоняется - только последняя строчка файла. Скобки поставь.


--------------------
Теперь при чем :P
PM   Вверх
WebCob
Дата 5.8.2004, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 4.8.2004

Репутация: нет
Всего: нет



На счет последней строчки, ладно скобки поставлю. А вот на счет моего вопроса:
Поля A и В числовые. А это начало диапазона, В это конец диапазона.
Поиск производится только по диапазону. В случае, если введенное число соответствует одному из диапазонов, то нужно вывести на print поля C;D;E;F именно той строки в которой было найдено число Э диапазону.
В моем примере А=$begin_count[$i], а В=$end_count[$i].
Нужно, чтобы найдя нужное значение между А и В в какой то из строк, выводилась информация полей C;D;E;F принадлежащие этой строке.

PM MAIL   Вверх
Ignat
Дата 5.8.2004, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 10
Всего: 73



Пожди, а мой пример что делает - обратно в файл, чтоль, записывает?


--------------------
Теперь при чем :P
PM   Вверх
WebCob
Дата 5.8.2004, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 4.8.2004

Репутация: нет
Всего: нет



А Ты бы мог дать пояснение к примеру? Этот пример, есть и на www.php.net. Но я нет так хорошо знаю PHP поэтому пока-что не поворотлив в нем. Если можно, то на моем примере. То, что задаем число, читаем файл, потом задаем цикл, и считаем строки задавая каждому $lines - свой номер строки, а что вот это:
($nums[0]<$number&&$nums[1]>$number)?echo $lines[$i]:""; Что она делает прежде чем выведет на печать?
Что такое $nums[0]? $number&&$nums[1]>$number - сравнение? тогда что с чем?
PM MAIL   Вверх
Ignat
Дата 5.8.2004, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 10
Всего: 73



Конструкция ... ?... : .... ; Берет свое начало в си - это аналог if(....){ ....}else{.....}; , но в одну строчку.
($nums[0]<$number&&$nums[1]>$number)?echo $lines[$i]:"";
Здесь ($nums[0]<$number&&$nums[1]>$number) - условие.
$nums[0]-A, $nums[1]-B, && - "И"(AND)

echo $lines[$i] - блок THEN
"" - блок ELSE (т.к. пустой ставим кавычки).
Explode есть и в твоем примере, думаю, с ним все понятно.


--------------------
Теперь при чем :P
PM   Вверх
WebCob
Дата 5.8.2004, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 4.8.2004

Репутация: нет
Всего: нет



Наверное я не правильно описал то что я хочу сделать.
Чего то не получается у меня... www.php.net, уже весь перевернул. Создавать текстовую базу это конечно дело не благодарное но решать задачу нужно. Вот копия содержимого test1.csv файла.
index_no;begin_count;end_count;start_action;end_action;info_action
1;lrmos117720000;lrmos117729999;01.05.2000;04.08.2004;Продается в салоне А
2;lrmos117730000;lrmos117739999;09.07.2001;05.08.2004;Продается в салоне В
3;lrmos117740000;lrmos117749999;15.08.2002;06.08.2004;Продается в салоне С
4;lrmos117750000;lrmos117759999;01.03.2002;07.08.2004;Продается в салоне D
5;lrmos117760000;lrmos117769999;01.01.2003;08.08.2004;Продается в салоне E
6;lrmos117770000;lrmos117779999;08.02.2003;09.08.2004;Продается в салоне F
7;lrmos117780000;lrmos117789999;30.07.2004;10.08.2004;Продается в салоне G
8;lrmos117790000;lrmos117799999;04.08.2004;11.08.2004;Продается в салоне H

Вот моя программа, которая должна обрабатывать csv файл и выводить на принт информацию только той строки в которой найден счет (к примеру: lrmos117720527, то вывести на принт поля 01.05.2000;04.08.2004;Продается в салоне А)

<?php
/*Okno dlya vvoda*/
print "<FORM NAME='card' METHOD=get><center><h1><br>";
print "<h2><font color=black>Введите счет начинающийся c lrmos.<br>";
print "<INPUT TYPE=text NAME=int_no SIZE=15>";
print "<INPUT TYPE=SUBMIT NAME=button VALUE=Enter><br>";
if ($button=="Enter")
/*Finish Okno dlya vvoda*/

$massive = file("test1.csv", "r");
$count_data = count($massive);
for($i=0; $i<$count_data; $i++)
$data = explode(";", $massive[$i]);
$index_no[$i] = $data[0];
$begin_count[$i] = $data[1];
$end_count[$i] = $data[2];
$start_action[$i] = $data[3];
$end_action[$i] = $data[4];
$info_action[$i] = $data[5];
$data[1] = array($begin_count[$i]);
$data[2] = array($end_count[$i]);
$data_count = count($begin_count);
while (--$data_count+1)
print "<br> $data[$i]- i<br>$int_no<br>$data[0]-0<br>$data[1]-1<br> $data[2]-2<br>$data[3]-3
$data[4]-4<br> $data[5]-5<br>\n";
if ($begin_count[$data_count] <= $int_no and $int_no <= $end_count[$data_count])
?>

Может есть идеи? С примером выше я уже пробовал.
PM MAIL   Вверх
Ignat
Дата 5.8.2004, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 10
Всего: 73



Лови, если не работает, скажи, тогда проверю. А сейчас со временем не очень.
Код
<?php
function rplc($text){
return str_replace("lrmos","",$text);
}

/*Okno dlya vvoda*/
print "<FORM NAME='card' METHOD=get><center><h1><br>";
print "<h2><font color=black>Введите счет начинающийся c lrmos.<br>";
print "<INPUT TYPE=text NAME=int_no SIZE=15>";
print "<INPUT TYPE=SUBMIT NAME=button VALUE=Enter><br>";
/*Finish Okno dlya vvoda*/

if (!empty($_GET)){

$number=&$_GET['int_no']
$lines=file("test1.csv","r");
for($i=0;$i<count($lines);$i++){
$nums=explode(";",$lines[$i]);

(rplc($nums[1])<$number&&rplc($nums[2])>$number)?printf("c %s по %s продается в салоне %s",$nums[3],$nums[4],$nums[5]):"";
}

}
?>





--------------------
Теперь при чем :P
PM   Вверх
WebCob
Дата 5.8.2004, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 4.8.2004

Репутация: нет
Всего: нет



Ок! У меня со временем тоже не особо, по этому понимаю. Ignat я через парочку минут и скажу Тебе.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0554 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.