Алгоритм разбора csv.

DeadLy

Новичок
Как сделать так, например, есть csv - файл с таким содержанием

МИКРОСХЕМЫ;;
1002пр2;9108;3
1002хл1;9522;5
ДИОДЫ;;
д311а;8609;10
2д102а;2002;5
СТАБИЛИТРОНЫ;;
2с108е;107;12
2с108е;9808;2
нужно чтобы принажатии на ссылку с именем (например ДИОДЫ) выводилась инфа только по ДИОДАМ..., т.е. как сделать чтобы скрипт разбивал файл по блокам


Оффтопик: Фигня какая-то, ответил в другой теме, создалась новая со старым названием ???-)
 

kruglov

Новичок
Эээ... Делаем сплит и загоняем в массив, какие проблемы?
 

DeadLy

Новичок
А как разделить, вот ума-то я и не приложу??
Можно код!!
 

Фанат

oncle terrible
Команда форума
готовый код просят в разделах "Оффтопик" и "Работа".
гарантированно получают, правда, только во втором

Если же тебя интересует помощь в самостоятельной работе, будь добр изложить - что именно тебе непонятно, что ты можешь сделать сам, что ты уже сделал, с какими проблемами столкнулся.

Если не можешь ничего, но хочешь научиться писать сам - PHP FAQ: Хочу изучать PHP и Mysql. С чего начать?
 

DeadLy

Новичок
Я просил не готовый код, а кусок кода с той бойдой про разделение...

Ну вобщем есть прайс в CSV.
Вывод в таблицу я сделал при помощи вот этого

<?
$f=fopen("price.csv","r") or die("Ошибка!");
for($i=0; $data=fgetcsv($f, 1000, ";"); $i++) {
$num = count($data);

If ($clr == "#F9FBFF") {
$clr = "#EAEDFF";
}
Else {
$clr = "#F9FBFF";
}

print "<tr bgcolor=$clr>
<td class=b02>$data[0]</a></td>
<td class=b03>$data[1]</td>
<td class=b02>$data[2]</td>
<td class=b02>$data[3]</td>
</tr>";

}
fclose($f);


?>
Работает он нормально

Но, я хочу понять как сделать так чтобы выводился не весь прайс а всего лишь его часть, ну например перейдя по ссылке price.php?category=led, выводился только кусок прайса с диодами... ну и т.д.
 

Фанат

oncle terrible
Команда форума
Вывод по кускам делается в два этапа.
сначала выводятся ссылки на разделы, а потом, при получении названия раздела из ссылки - один раздел.

Для начала надо определить названия разделов и вывести только их. Я правильно понимаю задачу?
У строки с разделом будет заполнен только один элемент в массиве $data. от этого и надо плясать
 

mike_S

Новичок
list fgetcvs(
int $f, //файловая переменная
int $len, //размер считываемой строки
char $dl //разделитель
)

и будет тебе счастье :)
 

Romantik

TeaM PHPClub
Я когдато делал подобное, но мне необходимо было еще и сформировать древовидное меню (3 вложения Группа-Категория-Товар)
Выход был такой:
1. В файл XLS добавлял константы, обозначающие примерно так:
Г1 0 - ГРУППА1
К2 Г1 - КАТЕГОРИЯ2 ГРУППА1
0 К2 - ТОВАР1 КАТЕГОРИЯ2
2. Формировал CSV файл
3. Парсил его, учитывая в логике константы формировал запросы в DB для создания меню.

Удачи
 

DeadLy

Новичок
Ну вообщем допёр как сделать названия разделов
нашёл 2 способа
первый
if ($data[1] == "" && $data[2] == ""){
print "<a href=\"price.php?category=$data[0]\">$data[0]\n<br>";
}
второй
$num = count($data);
if ($num==1){
print "<a href=\"price.php?category=$data[0]\">$data[0]\n<br>";
}
Первый мне больше нравится, потому что там строка с названием раздела может иметь любой вид (МИКРОСХЕМЫ;; и просто МИКРОСХЕМЫ), а во втором только МИКРОСХЕМЫ, иначе не выведется.

С этим разобрался, может дальше подтолкнёте...plz
 

Фанат

oncle terrible
Команда форума
а дальше совсем просто.
если получил category из адреса, то в точно тако же цикле прокручиваем твой прайс, и ждём, пока $data[0] не станет равно $_GET['category']
как только становится равно - начинаем выводить и ждём, пока не пойдёт следующая катенгория.
как дождались - перестаём выводить
 

DeadLy

Новичок
А тут я вообще не пойму, какими функциями пользоватся, пожалуйста можно чуть-чуть поконкретнее...т.е. как узнать что подошла новая категория.???
 

betik

Новичок
если файл csv небольшой, а скрипт вывода будет использоваться редко или очень редко, то можно на основе регулярников построить скрипт вывода, если большой файл или скриптом будут пользоваться часто -то лучше использовать какую-либо более осмысленную БД, данные в которую заносить скриптом на основе тех же регулярников...

Как вариант:

$end=0;
$what_to_display='Диоды';
$fils=file('csvfile.csv')
for($i=0; $i<count($file); $i++)
{
if(!ereg("^".$what_to_display.";;$", $file[$i])) continue;
else
{
$i++;
for($i=$i; $end!=0; $i++)
{
if(ereg("^.+;;$", $file[$i]))
{
$end=1;
$i=count($file);
continue;
}
$output[]=$file[$i];

}


}


}


полученный массив output содержит нужные строки...
Если я нигде не накосячил =)
 

DeadLy

Новичок
Автор оригинала: Фанат
если получил category из адреса, то в точно тако же цикле прокручиваем твой прайс, и ждём, пока $data[0] не станет равно $_GET['category']
как только становится равно - начинаем выводить и ждём, пока не пойдёт следующая катенгория.
как дождались - перестаём выводить
а как сделать так чтобы выводилась инфа не сначала а с середины. ну допустим дождались когда $data[0] и $category сравнялись, дальше print, но он начинает читать прайс с начала и в итоге ничего не выводися или выводится только первый кусок вначале...???
 

Фанат

oncle terrible
Команда форума
ты бы лучше код привёл, который выводит у тебя "первый кусок или не выводит ничего вообще".

как сделать так чтобы выводилась инфа не сначала а с середины.
непонятен твой вопрос.
я же написал - в цикле перебираем строки.
внутри ццикла:
сравниваем название категории с нужной. если совпало - выставляем переменную. $flag=1;
если $flag==1 то:
выводим строчку,
проверяем, не началась ли новая категория. если началась, то break
 

DeadLy

Новичок
Все равно не пойму как надо.
Вот у меня

PHP:
if ($data[0] == $_GET['category']) {
print "<td>$data[0]</td><td>$data[1]</td><td>$data[2]</td>"
}
или

PHP:
if ($data[0] == $_GET['category']) {
$flag = "1";
if ($flag==1) {
print "<td>$data[0]</td><td>$data[1]</td><td>$data[2]</td>"
}
}
Я правильно понял или нет?

Вобщем один х. выводится в таблице название раздела и всё...
 

SelenIT

IT-лунатик :)
DeadLy
Во втором варианте скобку от первого ифа закрой немного раньше. Устанавливать флаг нужно только один раз (и один раз сбрасывать), а проверять его - всегда.
 
Сверху