Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: обработка csv файла
 
 автор: Tema   (02.05.2006 в 17:41)   письмо автору
 
 

Есть файл .csv, структура:
"Item1/Item2/Item3";"Название чего-либо";"123221683";"7888,5";"шт";1
"Item1/Item2/Item3";"Название чего-либо";"12121683";"7818,5";"шт";2
"Item1/Item2/Item3";"Название чего-либо";"12231683";"78238,3";"шт";1
"Item1/ItemM/ItemN";"Название чего-либо";"125216812";"7238,5";"шт";1
"ItemS/ItemM/ItemN";"Название чего-либо";"125216812";"7238,5";"шт";1
Возможно ли "выцепить" item1", если он повоторяется несколько раз подряд?
Т.е. сделать такую структуру:
Item1
Item2
Item3
ItemS
ItemM
ItemS
и т.д.

   
 
 автор: Саня   (02.05.2006 в 18:42)   письмо автору
 
   для: Tema   (02.05.2006 в 17:41)
 

<?php
# откроем файл
$fp fopen("csv.txt""r");
# массив, в который будут помещаться все значения из файла
$a = array();
# в цикле построчно прочтём файл
while ( ($data fgetcsv($fp1000";")) !== false ) {
  
# разбивка по символу "/"
  
$expld explode("/"$data[0]);
  
# добавим в массив $a полученные значения
  
foreach ( $expld as $val array_push($a$val);
}
# из массива $a удалим все дублирующиеся значения
$b array_unique($a);

print 
"<pre>";
print_r($b);
?>

   
 
 автор: Tema   (02.05.2006 в 20:16)   письмо автору
 
   для: Саня   (02.05.2006 в 18:42)
 

Почти так. Структура немного не так получилась. Вот так надо:
Item1
------Item2
------Item3
ItemS
------ItemM
------Item4
Т.е. списком выводить первые позиции в "Item1/Item2/Item3", в данном случае это Item1.

   
 
 автор: Саня   (02.05.2006 в 21:27)   письмо автору
 
   для: Tema   (02.05.2006 в 20:16)
 

<?php
$fp 
fopen("csv.txt""r");
$a = array();
while ( (
$data fgetcsv($fp1000";")) !== false ) {
  
$expld explode("/"$data[0]);
  
# определение массива с пунктами меню первого уровня
  
if ( !isset($a[$expld[0]]) ) $a[$expld[0]] = array();
  
# занесение в массив данных, которые не повторяются в массиве первого уровня
  
if ( !in_array($expld[1], $a[$expld[0]]) ) $a[$expld[0]][] = $expld[1];
  if ( !
in_array($expld[2], $a[$expld[0]]) ) $a[$expld[0]][] = $expld[2];
}

print 
"<pre>";
print_r($a);

   
 
 автор: Tema   (02.05.2006 в 22:03)   письмо автору
 
   для: Саня   (02.05.2006 в 21:27)
 

Спасибо! То что надо.

   
 
 автор: Tema   (03.05.2006 в 21:22)   письмо автору
 
   для: Tema   (02.05.2006 в 22:03)
 

А еще такой вопрос. Как можно этот же файл:
"Item1/Item2/Item3";"Название чего-либо";"123221683";"7888,5";"шт";1
"Item1/Item2/Item3";"Название чего-либо";"12121683";"7818,5";"шт";2
"Item2/Item2/Item4";"Название чего-либо";"12231683";"78238,3";"шт";1
"Item3/ItemM/ItemN";"Название чего-либо";"125216812";"7238,5";"шт";1
"ItemS/ItemM/ItemN";"Название чего-либо";"125216812";"7238,5";"шт";1
Разбить на отдельные файлы, по Item1...S. Т.е. как определить где заканчивается, скажем, Item1 и начинается Item 2, а за ним Item3 и так далее?

   
 
 автор: Fly   (04.05.2006 в 12:55)
 
   для: Tema   (03.05.2006 в 21:22)
 

У меня тоже такая проблема, подскажите как сделать?

   
 
 автор: Саня   (04.05.2006 в 20:48)   письмо автору
 
   для: Tema   (03.05.2006 в 21:22)
 

<?php
$fp 
fopen("file.csv""r");
$a = array();
while ( (
$data fgetcsv($fp1000";")) !== false ) {
  
# вырезаем название первого элемента
  
$expld explode("/"$data[0], 2);
  
# ...и помещаем в один массив
  
$a[$expld[0]][] = $data;
}
# разбираем массив
foreach ( $a as $key => $val ) {
  
# создание нового файла, например Item1.csv
  
$f fopen($key.".csv""wt");
  
# в цикле запишем в новый файл строки
  
foreach ( $val as $str ) {
    
fputcsv($f$str";");
  }
  
fclose($f);
}
?>

   
 
 автор: Tema   (04.05.2006 в 21:12)   письмо автору
 
   для: Саня   (04.05.2006 в 20:48)
 

А для PHP 4 как можно сделать, ведь там еще нет putcsv()? :(

   
 
 автор: Саня   (04.05.2006 в 21:26)   письмо автору
 
   для: Tema   (04.05.2006 в 21:12)
 

<?php
$fp 
fopen("file.csv""r");
$a = array();
while ( (
$data fgetcsv($fp1000";")) !== false ) {
  
$expld explode("/"$data[0], 2);
  
$a[$expld[0]][] = $data;
}
foreach ( 
$a as $key => $val ) {
  
$f fopen($key.".csv""wt");
  foreach ( 
$val as $str ) {
    
$data "";
    foreach ( 
$str as $ent ) { $data .= '"'.$ent.'";'; }
    
$data trim($data";")."\n";
    
fputs($f$data);
  }
  
fclose($f);
}
?>

А для PHP 4 как можно сделать, ведь там еще нет putcsv())
Ещё один плюс в пользу перехода на PHP5 :)

   
 
 автор: Tema   (05.05.2006 в 15:34)   письмо автору
 
   для: Саня   (04.05.2006 в 21:26)
 

Я только за! Но вот хостеры что-то не торопятся... Спасибо!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования