как разбить csv

mr.MAIL

Новичок
как разбить csv

Такой вопрос. Надо разбить прайс в csv, который содержит более 5000 строк на логические составляющие. Т.е в прайсе есть строка "ноутбуки" и за ней сотня буков, "материнские платы" и сотни материнок. Прайс один, а на сайте надо сделать отдельное меню с ссылками только на ноутбуки, только на материнки и т.д. Т.е пользователь в меню выбирает "материнки" и загружается в виде таблицы только соответствующая часть прайса. Заранее спасибо
 

antson

Новичок
Партнер клуба
mr.MAIL
Раз вопрос задан в разделе баз данных , то ответ
предполагается на вопрос как затащить такой
прайс в базу при этом самым простым способом
у импортируемых записей выставлять раздел.

Все просто было если в прайсе записи были вида
ноутбук,модель,характеристики,цена
материнка,модель,характеристики,цена

если нет запятых внутри поля, то разбор файла
до массива решался в одну строчку

$a= file('1.csv');
foreach ( $A as $value) $value = explode(',',$value);
print_r($a);

в твоем случае нужно потом
пройтись по массиву ищя в нужной колонке смену
раздела например это в первой .

-~{}~ 28.09.05 08:51:

5000 строк. Не смертельно я втаскивал 180 тысяч записей.
вришлось подкрутить ограничения на время выполнения скрипта.

попутно считать файл целиком в переменную
и разобрать его на строки через explode(chr(10)..)
чем будет работать file()
 

Romantik

TeaM PHPClub
mr.MAIL
[m]fgetcsv[/m]
далее в прайсе делаешь подобие дерева. Т.е. добавляешь индексы
1;0;Notebooks
2;1;Aser
3;2;Aser 9500 256/60....
4;2;Aser 8500 128/30....
5;0;Motherboards
6;5;MSI
7;6;MSI 945PS....
Я думаю идея ясна, если нет Nested Sets
Еще как вариант (очень старый, используемый мною) примерно так:
PART;1;Notebooks
GRP;1;Aser
;Aser 9500 256/60....
;Aser 8500 128/30....
PART;2;Motherboards
GRP;2;MSI
;MSI 945PS....
GRP;2;ASUS
;ASUS P2PE...
меньше работы по забиванию индексов, что удобно, когда прайс большой, но продумать алгоритм парсинга по этим индексам
 

mr.MAIL

Новичок
Спасибо, но дело в том, что я занимаюсь другой областью программирования, в PHP я новичок и это вообще мой второй сайт в жизни. Нельзя ли решить эту задачу через массив прямо в PHP не используя больше ничего другого? Вот часть прайса:
Модемы;;;;;
SWEEX 56k Motorola (CA000040) Box ;BOX, SWEEX 56k Motorola PCI SOFT ;12;11;10;9
SWEEX 56k Ambient Hard (CA000010) Box ;56k Ambient 536 VOICE PCI HARD ;12;16;15;14
SWEEX 56k Ambient soft (CA000022) Box ;oem, 56k Ambient 537 PCI ;12;12;11;10
Сканеры;;;;;
Canon CanoScan LiDE 20 ;600x1200dpi, 48-bit, 3 кнопки. ;12;63;62;60
Canon CanoScan LiDE 35 ;1200х2400, А4, 48-bit, USB 2.0, 4 кнопки ;12;87;86;84
EPSON 1270 ;1200х2400, А4, 9600dpi, 48-bit, ССD, USB2.0, кабель, ;12;83;82;81
HP ScanJet 3690 ;1200x1200_, A4, EEP, _999_999_т/д,48bit, USB2.0.слайд модуль, 5шт.-113 ;12;111;111;111
Ноутбуки;;;;;
Acer TravelMate4021LMi (Centrino1,6/256);"Centrino-1,6GHz 256Mb 60Gb Video(shared)-64Mb Lan Modem DVD+-RW 15""(1024x768) Wi";12;1100;1090;1080
Samsung NP28PRKY06/SEK ;"2,8 кг, Cel M360 1,4 ГГц, 15"", 256Mb DDR333, 40Gb, Combo, ATI 9000, LAN и др. ";12;950;940;930
Samsung NP28PRKY07/SEK ;"Intel D740 1,73 ГГц, 15"", 512Mb, 40Gb, Combo, ATI 9000, LAN,IEEE 1394, RJ11 и др";12;1220;1210;1200


А вот скрипт, который я использовал:

<html>
<head>
<title>Price list</title>
</head>
<body>
<?
echo "<table border=1 cellspacing=2 cellpadding=2
bordercolor=Navy>\n";
$row = 1;
$fp = fopen ("price.csv","r");
while ($data = fgetcsv ($fp, 1000, ";")) {
$num = count ($data);
echo "<tr>\n";
for ($c=0; $c<$num; $c++) {

print "<td>$data[$c]</td>\n";

}
echo "</tr>\n";
$row++;
}
fclose ($fp);
echo "</table>";
?>

Можно ли задать в этом скрипте условие вывода так, чтобы пользователь видел информацию от последней строчки "Модемы" до первой строки "Ноутбуки", ну т.е только "Сканеры"?
 

SelenIT

IT-лунатик :)
Можно и не сложно. Например:
PHP:
<table border="1" ... >
<?
$row = 1;
$flag = 0;
$fp = fopen ("price.csv","r");
while ($data = fgetcsv ($fp, 1000, ";")) {
  // если строка - заголовок раздела, то все поля, кроме первого, пусты
  // что очень лего проверить таким условием:
  if (implode('',$data)==$data[0]) {
     if ($data[0]=='Сканеры')  $flag = 1; // можно выводить
     if ($data[0]=='Ноутбуки') break; // спасибо, хватит
  }
  if ($flag) { // выводим только подходящее
     // при однотипном оформлении ячеек вывести строку можно без 2-го цикла
     echo "<tr>\n<td>" . $row .
          "</td>\n<td>" . 
          implode("</td>\n<td>",$data) .
          "</td>\n</tr>\n";
     $row++;
  }
}
fclose ($fp);
?>
</table>
 
Сверху