За последние 24 часа нас посетили 18858 программистов и 1593 робота. Сейчас ищут 889 программистов ...

Задача c екселем

Тема в разделе "Прочее", создана пользователем goshalve, 2 апр 2011.

  1. goshalve

    goshalve Guest

    Смижу дома,звонит друг и говорит что нужно подправить файл ексель таблицы,и типо по данным составить смс рассылку.Имеется база данных ексель
    [​IMG]
    Столбцов там дохрена (7110) слева выводятся фамилии,спава телефоны,прричём в первом столбике скорее нет телефона чем есть,а во втором из 4500 записй нет только 20 телефонов.Записи могут повторяться как в первом столбике ,так и во втором.Необходимо склеить 4 столбца в 2 так чтобы: имя должно иметь дату рождения,убрать повторения и дать всем именам телефоны ,где они есть.Собственно сохранил эту вешь как чмл файл .Выделил вступление,ьело таблицы и завершение.Тело выглядит так:
    [​IMG]
    Стал набирать прогу,которая должна была создать правильный новый файл,в результате вышло в хмл такое
    [​IMG]
    Обломно что вроде правильно,но ексель упорно говорил что ошибка в таблице,хотя вывод вроде корректен.Вот сама прога:
    PHP:
    1.  
    2. <?php
    3. $body=file_get_contents("body.xml");
    4. $position=0;$counter=0;
    5. function getrow(){
    6. global $body,$position;
    7. $st=strpos($body,"<Row ",$position);
    8. $st=strpos($body,"<Row ",$position);
    9. if(($st==false))return false;
    10. $end=strpos($body,"</Row>",$position);
    11. $a=$end+6-$st;
    12. $position=$end+3;
    13. return substr($body,$st,$a);
    14. };
    15.  
    16. $names1=array();
    17. $names2=array();
    18. $namesr=array();
    19. $phonesr=array();
    20. $nstylescr=array();
    21. $nstylesdr=array();
    22. $pstylescr=array();
    23. $pstylesdr=array();
    24. $phones1=array();
    25. $phones2=array();
    26. $nstylesc1=array();
    27. $nstylesd1=array();
    28. $nstylesd2=array();
    29. $nstylesc2=array();
    30. $pstylesc1=array();
    31. $pstylesd1=array();
    32. $pstylesd2=array();
    33. $pstylesc2=array();
    34. $pids1=array();
    35. $nids2=array();
    36. $pids2=array();
    37.  
    38. $rows=array();
    39.  
    40. for($i=0;$i<7109;$i++){
    41. $rows[]=getrow();
    42. if($i==1000)echo "$i=1000";
    43. if($i==2000)echo "$i=2000";
    44. if($i==3000)echo "$i=3000";
    45. if($i==4000)echo "$i=4000";
    46. if($i==5000)echo "$i=5000";
    47. if($i==6000)echo "$i=6000";
    48. if($i==7000)echo "$i=7000";
    49. if($i==7108)echo "$i=7108";
    50. };
    51. unset($body);
    52. for($i=0;$i<sizeof($rows);$i++){
    53. $row=$rows[$i];
    54. $pos=0;
    55. $st=strpos($row,"<Cell",$pos)+5;
    56. $end=strpos($row,">",$st);
    57. $a=$end-$st;
    58. $nstylesc1[$i]=trim(substr($row,$st,$a));
    59. $pos=$end;
    60. $st=strpos($row,"<Data",$pos)+5;
    61. $end=strpos($row,">",$st);
    62. $a=$end-$st;
    63. $nstylesd1[$i]=trim(substr($row,$st,$a));
    64. $pos=$end;
    65. $st=$pos+1;
    66. $end=strpos($row,"<",$st);
    67. $a=$end-$st;
    68. $names1[$i]=trim(substr($row,$st,$a));
    69. $names2[$i]='';
    70. $phones2[$i]='';
    71. $phones1[$i]='';
    72. $pos=$end;
    73.  
    74. if(substr_count($row,'ss:Index="3"')==0){
    75. if(substr_count($row,"</Cell>")>1){
    76. $st=strpos($row,"<Cell",$pos)+5;
    77. $end=strpos($row,">",$st);
    78. $a=$end-$st;
    79. $pstylesc1[$i]=trim(substr($row,$st,$a));
    80. $pos=$end;
    81. $st=strpos($row,"<Data",$pos)+5;
    82. $end=strpos($row,">",$st);
    83. $a=$end-$st;
    84. $pstylesd1[$i]=trim(substr($row,$st,$a));
    85. $pos=$end;
    86. $st=$pos+1;
    87. $end=strpos($row,"<",$st);
    88. $a=$end-$st;
    89. $phones1[$i]=trim(substr($row,$st,$a));
    90. $pids1[]=$i;
    91. $pos=$end;
    92. if(substr_count($row,"</Cell>")>2){
    93. $st=strpos($row,"<Cell",$pos)+5;
    94. $end=strpos($row,">",$st);
    95. $a=$end-$st;
    96. $nstylesc2[$i]=trim(str_replace('ss:Index="3"','',substr($row,$st,$a)));
    97. $pos=$end;
    98. $st=strpos($row,"<Data",$pos)+5;
    99. $end=strpos($row,">",$st);
    100. $a=$end-$st;
    101. $nstylesd2[$i]=trim(substr($row,$st,$a));
    102. $pos=$end;
    103. $st=$pos+1;
    104. $end=strpos($row,"<",$st);
    105. $a=$end-$st;
    106. $names2[$i]=trim(substr($row,$st,$a));
    107. $nids2[]=$i;
    108. $pos=$end;
    109.  
    110. if(substr_count($row,"</Cell>")>3){
    111. $st=strpos($row,"<Cell",$pos)+5;
    112. $end=strpos($row,">",$st);
    113. $a=$end-$st;
    114. $pstylesc2[$i]=trim(substr($row,$st,$a));
    115. $pos=$end;
    116. $st=strpos($row,"<Data",$pos)+5;
    117. $end=strpos($row,">",$st);
    118. $a=$end-$st;
    119. $pstylesd2[$i]=trim(substr($row,$st,$a));
    120. $pos=$end;
    121. $st=$pos+1;
    122. $end=strpos($row,"<",$st);
    123. $a=$end-$st;
    124. $phones2[$i]=trim(substr($row,$st,$a));
    125. $pids2=$i;
    126. $pos=$end;
    127.  
    128. };
    129. };
    130.  
    131.  
    132.  
    133. };}else{
    134. if(substr_count($row,"</Cell>")>1){
    135. $st=strpos($row,"<Cell",$pos)+5;
    136. $end=strpos($row,">",$st);
    137. $a=$end-$st;
    138. $nstylesc2[$i]=trim(str_replace('ss:Index="3"','',substr($row,$st,$a)));
    139. $pos=$end;
    140. $st=strpos($row,"<Data",$pos)+5;
    141. $end=strpos($row,">",$st);
    142. $a=$end-$st;
    143. $nstylesd2[$i]=trim(substr($row,$st,$a));
    144. $pos=$end;
    145. $st=$pos+1;
    146. $end=strpos($row,"<",$st);
    147. $a=$end-$st;
    148. $names2[$i]=trim(substr($row,$st,$a));
    149. $nids2[]=$i;
    150. $pos=$end;
    151. if(substr_count($row,"</Cell>")>2){
    152. $st=strpos($row,"<Cell",$pos)+5;
    153. $end=strpos($row,">",$st);
    154. $a=$end-$st;
    155. $pstylesc2[$i]=trim(substr($row,$st,$a));
    156. $pos=$end;
    157. $st=strpos($row,"<Data",$pos)+5;
    158. $end=strpos($row,">",$st);
    159. $a=$end-$st;
    160. $pstylesd2[$i]=trim(substr($row,$st,$a));
    161. $pos=$end;
    162. $st=$pos+1;
    163. $end=strpos($row,"<",$st);
    164. $a=$end-$st;
    165. $phones2[$i]=trim(substr($row,$st,$a));
    166. $pos=$end;
    167.  
    168. };
    169.  
    170. };
    171. };
    172.  
    173.  
    174. if($i==1000)echo "$i=1000";
    175. if($i==2000)echo "$i=2000";
    176. if($i==3000)echo "$i=3000";
    177. if($i==4000)echo "$i=4000";
    178. if($i==5000)echo "$i=5000";
    179. if($i==6000)echo "$i=6000";
    180. if($i==7000)echo "$i=7000";
    181. //if($i==800)echo "$i=7108";
    182. };
    183. unset($rows);
    184.  
    185. for($i=0;$i<sizeof($names1);$i++){
    186. $namesr[]=$names1[$i];
    187. $phonesr[]=$phones1[$i];
    188. $nstylescr[]=$nstylesc1[$i];
    189. $nstylesdr[]=$nstylesd1[$i];
    190. if(!empty($pstylesc1[$i])){$pstylescr[]=$pstylesc1[$i];}else{$pstylescr[]=''; };
    191. if(!empty($pstylesd1[$i])){$pstylesdr[]=$pstylesd1[$i];}else{$pstylesdr[]=''; };
    192.  
    193. if($i==1000)echo "\$i=1000";
    194. if($i==2000)echo "\$i=2000";
    195. if($i==3000)echo "\$i=3000";
    196. if($i==4000)echo "\$i=4000";
    197. if($i==5000)echo "\$i=5000";
    198. if($i==6000)echo "\$i=6000";
    199. if($i==7000)echo "\$i=7000";
    200. if($i==7108)echo "\$i=7108";
    201.  
    202. };
    203.  
    204. for($i=0;$i<sizeof($nids2);$i++){
    205. $namesr[]=$names2[$nids2[$i]];
    206. $phone=$phones2[$nids2[$i]];
    207. $nstylescr[]=$nstylesc2[$nids2[$i]];
    208. $nstylesdr[]=$nstylesd2[$nids2[$i]];
    209. $phonesr[]=$phone;
    210. if(!empty($phone)){
    211. $pstylescr[]=$pstylesc2[$nids2[$i]];
    212. $pstylesdr[]=$pstylesd2[$nids2[$i]];
    213.  
    214.  
    215. }else{
    216. $pstylescr[]='';
    217. $pstylesdr[]='';
    218. };
    219.  
    220. if($i==1000)echo "\$i=1000";
    221. if($i==2000)echo "\$i=2000";
    222. if($i==3000)echo "\$i=3000";
    223. if($i==4000)echo "\$i=4000";
    224. if($i==5000)echo "\$i=5000";
    225. if($i==6000)echo "\$i=6000";
    226. if($i==7000)echo "\$i=7000";
    227. if($i==8000)echo "\$i=8000";
    228. if($i==9000)echo "\$i=9000";
    229. if($i==10000)echo "\$i=10000";
    230. if($i==11000)echo "\$i=11000";
    231. if($i==12000)echo "\$i=12000";
    232. if($i==13000)echo "\$i=13000";
    233. if($i==14000)echo "\$i=14000";
    234. if($i==15000)echo "\$i=15000";
    235. if($i==16000)echo "\$i=16000";
    236. };
    237.  
    238. $counter=sizeof($namesr)-1;
    239. echo("sizeof=$counter");
    240. for($i=0;$i<sizeof($namesr)-1;$i++){
    241. for($j=$i+1;$j<sizeof($namesr);$j++){
    242. if(substr_count(strtolower($namesr[$i]),strtolower($namesr[$j]))>0){
    243. if(!empty($phonesr[$j]))$phonesr[$i]=$phonesr[$j];
    244. $counter--;
    245.  
    246.  
    247.  
    248. }else{
    249.  
    250.  
    251.  
    252. };
    253.  
    254. };
    255. if($i==1000)echo "\$i=1000";
    256. if($i==2000)echo "\$i=2000";
    257. if($i==3000)echo "\$i=3000";
    258. if($i==4000)echo "\$i=4000";
    259. if($i==5000)echo "\$i=5000";
    260. if($i==6000)echo "\$i=6000";
    261. if($i==7000)echo "\$i=7000";
    262. if($i==8000)echo "\$i=8000";
    263. if($i==9000)echo "\$i=9000";
    264. if($i==10000)echo "\$i=10000";
    265. if($i==11000)echo "\$i=11000";
    266. if($i==12000)echo "\$i=12000";
    267. if($i==13000)echo "\$i=13000";
    268. if($i==14000)echo "\$i=14000";
    269. if($i==15000)echo "\$i=15000";
    270. if($i==16000)echo "\$i=16000";
    271. };
    272.  
    273. echo("counter=$counter");
    274.  
    275. unset($names1);
    276. unset($phones1);
    277. unset($names2);
    278. unset($phones2);
    279.  
    280. for($i=0;$i<sizeof($namesr)-1;$i++){
    281. for($j=$i+1;$j<sizeof($namesr);$j++){
    282. if($namesr[$j]<$namesr[$i]){
    283. $buf=$namesr[$i];
    284. $namesr[$i]=$namesr[$j] ;
    285. $namesr[$j]=$buf;
    286. $buf=$phonesr[$i];
    287. $phonesr[$i]=$phonesr[$j];
    288. $phoners[$j]=$buf;
    289. $buf=$nstylescr[$i];
    290. $nstylescr[$i]=$nstylescr[$j];
    291. $nstylescr[$j]=$buf;
    292. $buf=$nstylesdr[$i];
    293. $nstylesdr[$i]=$nstylesdr[$j];
    294. $nstylesdr[$j]=$buf;
    295. $buf=$pstylescr[$i];
    296. $pstylescr[$i]=$pstylescr[$j];
    297. $pstylescr[$j]=$buf;
    298. $buf=$pstylesdr[$i];
    299. $pstylesdr[$i]=$pstylesdr[$j];
    300. $pstylesdr[$j]=$buf;
    301.  
    302.  
    303. };
    304.  
    305.  
    306.  
    307.  
    308. };
    309. if($i==1000)echo "\$i=1000";
    310. if($i==2000)echo "\$i=2000";
    311. if($i==3000)echo "\$i=3000";
    312. if($i==4000)echo "\$i=4000";
    313. if($i==5000)echo "\$i=5000";
    314. if($i==6000)echo "\$i=6000";
    315. if($i==7000)echo "\$i=7000";
    316. if($i==8000)echo "\$i=8000";
    317. if($i==9000)echo "\$i=9000";
    318. if($i==10000)echo "\$i=10000";
    319. if($i==11000)echo "\$i=11000";
    320. if($i==12000)echo "\$i=12000";
    321. if($i==13000)echo "\$i=13000";
    322. if($i==14000)echo "\$i=14000";
    323. if($i==15000)echo "\$i=15000";
    324. if($i==16000)echo "\$i=16000";
    325.  
    326. };
    327.  
    328.  
    329. $final='';
    330. for($i=0;$i<=$counter;$i++){
    331. $final.='<Row ss:AutoFitHeight="0" ss:Height="12.1875">'."\r\n";
    332. $final.="<Cell $nstylescr[$i] ><Data $nstylesdr[$i] >$namesr[$i]</Data></Cell>"."\r\n";
    333. if(!empty($phonesr[$i])){
    334. $final.="<Cell $pstylescr[$i] ><Data $pstylesdr[$i] >$phonesr[$i]</Data></Cell>"."\r\n";
    335. };
    336. $final.="</Row>";
    337. if($i==1000)echo "\$i=1000";
    338. if($i==2000)echo "\$i=2000";
    339. if($i==3000)echo "\$i=3000";
    340. if($i==4000)echo "\$i=4000";
    341. if($i==5000)echo "\$i=5000";
    342. if($i==6000)echo "\$i=6000";
    343. if($i==7000)echo "\$i=7000";
    344. if($i==8000)echo "\$i=8000";
    345. if($i==9000)echo "\$i=9000";
    346. if($i==10000)echo "\$i=10000";
    347. if($i==11000)echo "\$i=11000";
    348. if($i==12000)echo "\$i=12000";
    349. if($i==13000)echo "\$i=13000";
    350. if($i==14000)echo "\$i=14000";
    351. if($i==15000)echo "\$i=15000";
    352. if($i==16000)echo "\$i=16000";
    353.  
    354. };
    355. $final.="</Table>" ;
    356.  
    357. $prefix=file_get_contents("prefix.xml");
    358. $posix=file_get_contents("posix.xml");
    359.  
    360. $final=$prefix.$final.$posix;
    361.  
    362. file_put_contents("final.xml",$final);
    363.  
    364. echo(substr_count($final,"<Row ")) ;
    365.  
    366.  
    367.  
    368. ?>
    В общем после 3 часов думанья прога родила хмл файл,только вот ексель ругается.В чем дело?[/url]
     
  2. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    я бы через OLE че нить замутил

    а файл можешь дать? академического интересу ради :)
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    либо я ничего не понял, либо у автора трава забориста =)

    копируем столбцы C и D в новый лист, сортируем - так уйдут пустые строки, копируем обратно вставляя снизу и все =) дело шито-крыто.

    Потом тупо копипастим это в .txt и бьем по табам и строкам в многомерный массив, херим дубли (до/после/во время) через встроенную функцию пхп - http://ru.php.net/manual/en/function.array-unique.php

    усе hотово, шеф!

    а xml тут зачем?
     
  4. engager

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

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    порадовало
    Код (Text):
    1.  if($i==1000)echo "\$i=1000";
    2.  if($i==2000)echo "\$i=2000";
    3.  if($i==3000)echo "\$i=3000";
    4.  if($i==4000)echo "\$i=4000";
    5.  if($i==5000)echo "\$i=5000";
    6.  if($i==6000)echo "\$i=6000";
    7.  if($i==7000)echo "\$i=7000";
    8.  if($i==8000)echo "\$i=8000";
    9.  if($i==9000)echo "\$i=9000";
    10.  if($i==10000)echo "\$i=10000";
    11.  if($i==11000)echo "\$i=11000";
    12.  if($i==12000)echo "\$i=12000";
    13.  if($i==13000)echo "\$i=13000";
    14.  if($i==14000)echo "\$i=14000";
    15.  if($i==15000)echo "\$i=15000";
    16.  if($i==16000)echo "\$i=16000";
    напоминает стиль кодеров, которым платят за количество строк кода.
    echo('$i='.$i);
     
  5. goshalve

    goshalve Guest

    antonn
    Давай,скажи мыло своё-сброшу!
    igordata
    Не врубаюсь я в ексель,можешь короче форматнуть чуток,если я тебе тоже на почту скину?
    engager
    Потому что база здоровеная и программа считала несколько часов,я думал что она повисла.В результате за 4 часа она таки выполнилась!
     
  6. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну кинь igor<>besmarter.ru
     
  8. goshalve

    goshalve Guest

  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    один телефон без фамилии. заканчивается на 2711. выкину его.
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    При совмещении двух списков явственно видно, что некоторые люди имеют по две строки. Выглядит так:

    Код (Text):
    1.  
    2. Пупкин Василий                           телефон
    3. Пупкин Василий дата рождения
    это понятно. Сложностей нету. Ща придумаю как быть =)
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    готово.

    формат вывода собирай сам. отправляю на мыло.
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    гы... отквочу твой код, чтобы не пропал :D

    PHP:
    1. <?php
    2.  
    3. $body = file_get_contents("body.xml");
    4. $position = 0; $counter = 0;
    5.  
    6. function getrow() {
    7.   global $body, $position;
    8.   $st = strpos($body, "<Row ", $position);
    9.   $st = strpos($body, "<Row ", $position);
    10.   if (($st == false)
    11.     )return false;
    12.   $end = strpos($body, "</Row>", $position);
    13.   $a = $end + 6 - $st;
    14.   $position = $end + 3;
    15.   return substr($body, $st, $a);
    16. }
    17.  
    18. ;
    19.  
    20. $names1 = array();
    21. $names2 = array();
    22. $namesr = array();
    23. $phonesr = array();
    24. $nstylescr = array();
    25. $nstylesdr = array();
    26. $pstylescr = array();
    27. $pstylesdr = array();
    28. $phones1 = array();
    29. $phones2 = array();
    30. $nstylesc1 = array();
    31. $nstylesd1 = array();
    32. $nstylesd2 = array();
    33. $nstylesc2 = array();
    34. $pstylesc1 = array();
    35. $pstylesd1 = array();
    36. $pstylesd2 = array();
    37. $pstylesc2 = array();
    38. $pids1 = array();
    39. $nids2 = array();
    40. $pids2 = array();
    41.  
    42. $rows = array();
    43.  
    44. for ($i = 0; $i < 7109; $i++) {
    45.   $rows[] = getrow();
    46.   if ($i == 1000
    47.     )echo "$i=1000";
    48.   if ($i == 2000
    49.     )echo "$i=2000";
    50.   if ($i == 3000
    51.     )echo "$i=3000";
    52.   if ($i == 4000
    53.     )echo "$i=4000";
    54.   if ($i == 5000
    55.     )echo "$i=5000";
    56.   if ($i == 6000
    57.     )echo "$i=6000";
    58.   if ($i == 7000
    59.     )echo "$i=7000";
    60.   if ($i == 7108
    61.     )echo "$i=7108";
    62. };
    63. unset($body);
    64. for ($i = 0; $i < sizeof($rows); $i++) {
    65.   $row = $rows[$i];
    66.   $pos = 0;
    67.   $st = strpos($row, "<Cell", $pos) + 5;
    68.   $end = strpos($row, ">", $st);
    69.   $a = $end - $st;
    70.   $nstylesc1[$i] = trim(substr($row, $st, $a));
    71.   $pos = $end;
    72.   $st = strpos($row, "<Data", $pos) + 5;
    73.   $end = strpos($row, ">", $st);
    74.   $a = $end - $st;
    75.   $nstylesd1[$i] = trim(substr($row, $st, $a));
    76.   $pos = $end;
    77.   $st = $pos + 1;
    78.   $end = strpos($row, "<", $st);
    79.   $a = $end - $st;
    80.   $names1[$i] = trim(substr($row, $st, $a));
    81.   $names2[$i] = '';
    82.   $phones2[$i] = '';
    83.   $phones1[$i] = '';
    84.   $pos = $end;
    85.  
    86.   if (substr_count($row, 'ss:Index="3"') == 0) {
    87.     if (substr_count($row, "</Cell>") > 1) {
    88.       $st = strpos($row, "<Cell", $pos) + 5;
    89.       $end = strpos($row, ">", $st);
    90.       $a = $end - $st;
    91.       $pstylesc1[$i] = trim(substr($row, $st, $a));
    92.       $pos = $end;
    93.       $st = strpos($row, "<Data", $pos) + 5;
    94.       $end = strpos($row, ">", $st);
    95.       $a = $end - $st;
    96.       $pstylesd1[$i] = trim(substr($row, $st, $a));
    97.       $pos = $end;
    98.       $st = $pos + 1;
    99.       $end = strpos($row, "<", $st);
    100.       $a = $end - $st;
    101.       $phones1[$i] = trim(substr($row, $st, $a));
    102.       $pids1[] = $i;
    103.       $pos = $end;
    104.       if (substr_count($row, "</Cell>") > 2) {
    105.         $st = strpos($row, "<Cell", $pos) + 5;
    106.         $end = strpos($row, ">", $st);
    107.         $a = $end - $st;
    108.         $nstylesc2[$i] = trim(str_replace('ss:Index="3"', '', substr($row, $st, $a)));
    109.         $pos = $end;
    110.         $st = strpos($row, "<Data", $pos) + 5;
    111.         $end = strpos($row, ">", $st);
    112.         $a = $end - $st;
    113.         $nstylesd2[$i] = trim(substr($row, $st, $a));
    114.         $pos = $end;
    115.         $st = $pos + 1;
    116.         $end = strpos($row, "<", $st);
    117.         $a = $end - $st;
    118.         $names2[$i] = trim(substr($row, $st, $a));
    119.         $nids2[] = $i;
    120.         $pos = $end;
    121.  
    122.         if (substr_count($row, "</Cell>") > 3) {
    123.           $st = strpos($row, "<Cell", $pos) + 5;
    124.           $end = strpos($row, ">", $st);
    125.           $a = $end - $st;
    126.           $pstylesc2[$i] = trim(substr($row, $st, $a));
    127.           $pos = $end;
    128.           $st = strpos($row, "<Data", $pos) + 5;
    129.           $end = strpos($row, ">", $st);
    130.           $a = $end - $st;
    131.           $pstylesd2[$i] = trim(substr($row, $st, $a));
    132.           $pos = $end;
    133.           $st = $pos + 1;
    134.           $end = strpos($row, "<", $st);
    135.           $a = $end - $st;
    136.           $phones2[$i] = trim(substr($row, $st, $a));
    137.           $pids2 = $i;
    138.           $pos = $end;
    139.         };
    140.       };
    141.     }; } else {
    142.     if (substr_count($row, "</Cell>") > 1) {
    143.       $st = strpos($row, "<Cell", $pos) + 5;
    144.       $end = strpos($row, ">", $st);
    145.       $a = $end - $st;
    146.       $nstylesc2[$i] = trim(str_replace('ss:Index="3"', '', substr($row, $st, $a)));
    147.       $pos = $end;
    148.       $st = strpos($row, "<Data", $pos) + 5;
    149.       $end = strpos($row, ">", $st);
    150.       $a = $end - $st;
    151.       $nstylesd2[$i] = trim(substr($row, $st, $a));
    152.       $pos = $end;
    153.       $st = $pos + 1;
    154.       $end = strpos($row, "<", $st);
    155.       $a = $end - $st;
    156.       $names2[$i] = trim(substr($row, $st, $a));
    157.       $nids2[] = $i;
    158.       $pos = $end;
    159.       if (substr_count($row, "</Cell>") > 2) {
    160.         $st = strpos($row, "<Cell", $pos) + 5;
    161.         $end = strpos($row, ">", $st);
    162.         $a = $end - $st;
    163.         $pstylesc2[$i] = trim(substr($row, $st, $a));
    164.         $pos = $end;
    165.         $st = strpos($row, "<Data", $pos) + 5;
    166.         $end = strpos($row, ">", $st);
    167.         $a = $end - $st;
    168.         $pstylesd2[$i] = trim(substr($row, $st, $a));
    169.         $pos = $end;
    170.         $st = $pos + 1;
    171.         $end = strpos($row, "<", $st);
    172.         $a = $end - $st;
    173.         $phones2[$i] = trim(substr($row, $st, $a));
    174.         $pos = $end;
    175.       };
    176.     };
    177.   };
    178.  
    179.  
    180.   if ($i == 1000
    181.     )echo "$i=1000";
    182.   if ($i == 2000
    183.     )echo "$i=2000";
    184.   if ($i == 3000
    185.     )echo "$i=3000";
    186.   if ($i == 4000
    187.     )echo "$i=4000";
    188.   if ($i == 5000
    189.     )echo "$i=5000";
    190.   if ($i == 6000
    191.     )echo "$i=6000";
    192.   if ($i == 7000
    193.     )echo "$i=7000";
    194.   //if($i==800)echo "$i=7108";
    195. };
    196. unset($rows);
    197.  
    198. for ($i = 0; $i < sizeof($names1); $i++) {
    199.   $namesr[] = $names1[$i];
    200.   $phonesr[] = $phones1[$i];
    201.   $nstylescr[] = $nstylesc1[$i];
    202.   $nstylesdr[] = $nstylesd1[$i];
    203.   if (!empty($pstylesc1[$i])) { $pstylescr[] = $pstylesc1[$i]; } else { $pstylescr[] = ''; };
    204.   if (!empty($pstylesd1[$i])) { $pstylesdr[] = $pstylesd1[$i]; } else { $pstylesdr[] = ''; };
    205.  
    206.   if ($i == 1000
    207.     )echo "\$i=1000";
    208.   if ($i == 2000
    209.     )echo "\$i=2000";
    210.   if ($i == 3000
    211.     )echo "\$i=3000";
    212.   if ($i == 4000
    213.     )echo "\$i=4000";
    214.   if ($i == 5000
    215.     )echo "\$i=5000";
    216.   if ($i == 6000
    217.     )echo "\$i=6000";
    218.   if ($i == 7000
    219.     )echo "\$i=7000";
    220.   if ($i == 7108
    221.     )echo "\$i=7108";
    222. };
    223.  
    224. for ($i = 0; $i < sizeof($nids2); $i++) {
    225.   $namesr[] = $names2[$nids2[$i]];
    226.   $phone = $phones2[$nids2[$i]];
    227.   $nstylescr[] = $nstylesc2[$nids2[$i]];
    228.   $nstylesdr[] = $nstylesd2[$nids2[$i]];
    229.   $phonesr[] = $phone;
    230.   if (!empty($phone)) {
    231.     $pstylescr[] = $pstylesc2[$nids2[$i]];
    232.     $pstylesdr[] = $pstylesd2[$nids2[$i]];
    233.   } else {
    234.     $pstylescr[] = '';
    235.     $pstylesdr[] = '';
    236.   };
    237.  
    238.   if ($i == 1000
    239.     )echo "\$i=1000";
    240.   if ($i == 2000
    241.     )echo "\$i=2000";
    242.   if ($i == 3000
    243.     )echo "\$i=3000";
    244.   if ($i == 4000
    245.     )echo "\$i=4000";
    246.   if ($i == 5000
    247.     )echo "\$i=5000";
    248.   if ($i == 6000
    249.     )echo "\$i=6000";
    250.   if ($i == 7000
    251.     )echo "\$i=7000";
    252.   if ($i == 8000
    253.     )echo "\$i=8000";
    254.   if ($i == 9000
    255.     )echo "\$i=9000";
    256.   if ($i == 10000
    257.     )echo "\$i=10000";
    258.   if ($i == 11000
    259.     )echo "\$i=11000";
    260.   if ($i == 12000
    261.     )echo "\$i=12000";
    262.   if ($i == 13000
    263.     )echo "\$i=13000";
    264.   if ($i == 14000
    265.     )echo "\$i=14000";
    266.   if ($i == 15000
    267.     )echo "\$i=15000";
    268.   if ($i == 16000
    269.     )echo "\$i=16000";
    270. };
    271.  
    272. $counter = sizeof($namesr) - 1;
    273. echo("sizeof=$counter");
    274. for ($i = 0; $i < sizeof($namesr) - 1; $i++) {
    275.   for ($j = $i + 1; $j < sizeof($namesr); $j++) {
    276.     if (substr_count(strtolower($namesr[$i]), strtolower($namesr[$j])) > 0) {
    277.       if (!empty($phonesr[$j])
    278.         )$phonesr[$i] = $phonesr[$j];
    279.       $counter--;
    280.     }else {
    281.      
    282.     };
    283.   };
    284.   if ($i == 1000
    285.     )echo "\$i=1000";
    286.   if ($i == 2000
    287.     )echo "\$i=2000";
    288.   if ($i == 3000
    289.     )echo "\$i=3000";
    290.   if ($i == 4000
    291.     )echo "\$i=4000";
    292.   if ($i == 5000
    293.     )echo "\$i=5000";
    294.   if ($i == 6000
    295.     )echo "\$i=6000";
    296.   if ($i == 7000
    297.     )echo "\$i=7000";
    298.   if ($i == 8000
    299.     )echo "\$i=8000";
    300.   if ($i == 9000
    301.     )echo "\$i=9000";
    302.   if ($i == 10000
    303.     )echo "\$i=10000";
    304.   if ($i == 11000
    305.     )echo "\$i=11000";
    306.   if ($i == 12000
    307.     )echo "\$i=12000";
    308.   if ($i == 13000
    309.     )echo "\$i=13000";
    310.   if ($i == 14000
    311.     )echo "\$i=14000";
    312.   if ($i == 15000
    313.     )echo "\$i=15000";
    314.   if ($i == 16000
    315.     )echo "\$i=16000";
    316. };
    317.  
    318. echo("counter=$counter");
    319.  
    320. unset($names1);
    321. unset($phones1);
    322. unset($names2);
    323. unset($phones2);
    324.  
    325. for ($i = 0; $i < sizeof($namesr) - 1; $i++) {
    326.   for ($j = $i + 1; $j < sizeof($namesr); $j++) {
    327.     if ($namesr[$j] < $namesr[$i]) {
    328.       $buf = $namesr[$i];
    329.       $namesr[$i] = $namesr[$j];
    330.       $namesr[$j] = $buf;
    331.       $buf = $phonesr[$i];
    332.       $phonesr[$i] = $phonesr[$j];
    333.       $phoners[$j] = $buf;
    334.       $buf = $nstylescr[$i];
    335.       $nstylescr[$i] = $nstylescr[$j];
    336.       $nstylescr[$j] = $buf;
    337.       $buf = $nstylesdr[$i];
    338.       $nstylesdr[$i] = $nstylesdr[$j];
    339.       $nstylesdr[$j] = $buf;
    340.       $buf = $pstylescr[$i];
    341.       $pstylescr[$i] = $pstylescr[$j];
    342.       $pstylescr[$j] = $buf;
    343.       $buf = $pstylesdr[$i];
    344.       $pstylesdr[$i] = $pstylesdr[$j];
    345.       $pstylesdr[$j] = $buf;
    346.     };
    347.   };
    348.   if ($i == 1000
    349.     )echo "\$i=1000";
    350.   if ($i == 2000
    351.     )echo "\$i=2000";
    352.   if ($i == 3000
    353.     )echo "\$i=3000";
    354.   if ($i == 4000
    355.     )echo "\$i=4000";
    356.   if ($i == 5000
    357.     )echo "\$i=5000";
    358.   if ($i == 6000
    359.     )echo "\$i=6000";
    360.   if ($i == 7000
    361.     )echo "\$i=7000";
    362.   if ($i == 8000
    363.     )echo "\$i=8000";
    364.   if ($i == 9000
    365.     )echo "\$i=9000";
    366.   if ($i == 10000
    367.     )echo "\$i=10000";
    368.   if ($i == 11000
    369.     )echo "\$i=11000";
    370.   if ($i == 12000
    371.     )echo "\$i=12000";
    372.   if ($i == 13000
    373.     )echo "\$i=13000";
    374.   if ($i == 14000
    375.     )echo "\$i=14000";
    376.   if ($i == 15000
    377.     )echo "\$i=15000";
    378.   if ($i == 16000
    379.     )echo "\$i=16000";
    380. };
    381.  
    382.  
    383. $final = '';
    384. for ($i = 0; $i <= $counter; $i++) {
    385.   $final.='<Row ss:AutoFitHeight="0" ss:Height="12.1875">' . "\r\n";
    386.   $final.="<Cell $nstylescr[$i] ><Data $nstylesdr[$i] >$namesr[$i]</Data></Cell>" . "\r\n";
    387.   if (!empty($phonesr[$i])) {
    388.     $final.="<Cell $pstylescr[$i] ><Data $pstylesdr[$i] >$phonesr[$i]</Data></Cell>" . "\r\n";
    389.   };
    390.   $final.="</Row>";
    391.   if ($i == 1000
    392.     )echo "\$i=1000";
    393.   if ($i == 2000
    394.     )echo "\$i=2000";
    395.   if ($i == 3000
    396.     )echo "\$i=3000";
    397.   if ($i == 4000
    398.     )echo "\$i=4000";
    399.   if ($i == 5000
    400.     )echo "\$i=5000";
    401.   if ($i == 6000
    402.     )echo "\$i=6000";
    403.   if ($i == 7000
    404.     )echo "\$i=7000";
    405.   if ($i == 8000
    406.     )echo "\$i=8000";
    407.   if ($i == 9000
    408.     )echo "\$i=9000";
    409.   if ($i == 10000
    410.     )echo "\$i=10000";
    411.   if ($i == 11000
    412.     )echo "\$i=11000";
    413.   if ($i == 12000
    414.     )echo "\$i=12000";
    415.   if ($i == 13000
    416.     )echo "\$i=13000";
    417.   if ($i == 14000
    418.     )echo "\$i=14000";
    419.   if ($i == 15000
    420.     )echo "\$i=15000";
    421.   if ($i == 16000
    422.     )echo "\$i=16000";
    423. };
    424. $final.="</Table>";
    425.  
    426. $prefix = file_get_contents("prefix.xml");
    427. $posix = file_get_contents("posix.xml");
    428.  
    429. $final = $prefix . $final . $posix;
    430.  
    431. file_put_contents("final.xml", $final);
    432.  
    433. echo(substr_count($final, "<Row "));
    434. ?>
     
  13. goshalve

    goshalve Guest

    igordata
    А чего в результате массив people содержит?
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    goshalve
    ну вардамп сделай, да посмотри.

    там на каждого человека имя, если есть - дата, если есть - телефон.

    вот ты в цикле форыч по ним проходишь, и смски у кого есть телефон послыаешь, а у кого еще и дата - тем даже с ДР подзравления! :D
     
  15. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Надеюсь автору кто-нить даст 3.14ды за разбазаривание чужих данных открыто на форуме.
     
  16. goshalve

    goshalve Guest

    MiksIr
    Да ладно там такая убогая база что рассылку чтобы провести нужно как минимум её воостановить-а это ваще нереально .
    igordata
    по ходу содержится переменная $val а она является массивом,как получить имя и телефон 11 по счёту человека?
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    goshalve
    это человек,который решил делать сайты забугорные. :D

    ноу коментс.

    ты вардамп сделал блин? нука быстро мозги в кучку собрал! :D
     
  18. goshalve

    goshalve Guest

    igordata
    Сейчас визитку буду делать сайтам забугорным!
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Спроси у них, кровавые слезы они уже приготовили?
     
  20. goshalve

    goshalve Guest

    igordata
    Ну чего ты так обо мне по моему очень даже красиво получилось!На мыло вышлю-увидишь,так мне еще неделю насморк лечить потому что течет
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    высылай =)
     
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты с человеками-эксельками разобрался?
     
  23. goshalve

    goshalve Guest

    Программа получилась такая в результате (твой код и мой вывод)
    PHP:
    1. <?php
    2.  
    3. $a = file("base.txt");
    4.  
    5. $people = array();
    6. foreach ($a as $val) {
    7.    $date = false; //или ""
    8.    $val = explode("\t", $val);
    9.    if (preg_match("/\d{2}\.\d{2}\.\d{4}/", substr($val[0], -10))) {
    10.      //тут есть дата рождения
    11.      $date = substr($val[0], -10);
    12.      $val[0] = substr($val[0], 0, strlen($val[0]) - 11);
    13.    }
    14.    $val[0] = trim($val[0]);
    15.    if ($date) {
    16.      $people[$val[0]]['date'] = $date;
    17.    }
    18.    if (isset($val[1])) {
    19.      $val[1] = trim($val[1]);
    20.      if ($val[1]) {
    21.        $people[$val[0]]['phones'][] = $val[1]; //у некоторых людей по несколько разных телефонов.
    22.      }
    23.    }
    24. }
    25.  
    26. foreach ($people as &$val) {
    27.    if (isset($val['phones'])) {
    28.      $val['phones'] = array_unique($val['phones']);
    29.    }
    30. };
    31. $final='';
    32. foreach ($people as $val=>$data) {
    33.  
    34.  
    35. $phone='';
    36. if(isset($data['phones']))$phone=$data['phones'];
    37. if(!empty($phone))$phone=$phone[0];
    38.  
    39. $final.='<Row>'."\r\n";
    40. $final.="<Cell><Data>$val</Data></Cell>"."\r\n";
    41. $final.="<Cell><Data>$phone</Data></Cell>"."\r\n";
    42. $final.="</Row>";
    43.  
    44. };
    45. $final.="</Table>";
    46. $prefix=file_get_contents("prefix.xml");
    47. $posix=file_get_contents("posix.xml");
    48. file_put_contents("fin.xml",$prefix.$final.$posix);
    49.  
    50. ?>
    Опять ошибку он нашел,пишет таблица неправильно составлена
     
  24. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Ух. Красиво. Код от igordata? Респект :)
     
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    спакуха. вот такого:
    $phone='';
    if(isset($data['phones']))$phone=$data['phones'];
    if(!empty($phone))$phone=$phone[0];

    я не пишу. мой до 30 строки =)

    А глаза - точно Лешкины! (с) бабки у подъезда (шутка)

    вобще можно было уложиться и по-меньше, но телефоны бывает, что дублятся.
    =) 25 строк против 434.

    goshalve
    Опять ошибку он нашел,пишет таблица неправильно составлена
    на вид все правильно. возможно стоит пробежаться глазами по таблице, она хоть и большая, но должна получиться однообразной и любой косяк будет заметен.

    предлагаю заменить этот код
    PHP:
    1. <?
    2. $phone='';
    3.  if(isset($data['phones']))$phone=$data['phones'];
    4.  if(!empty($phone))$phone=$phone[0];
    5.  
    6.  $final.='<Row>'."\r\n";
    7.  $final.="<Cell><Data>$val</Data></Cell>"."\r\n";
    8.  $final.="<Cell><Data>$phone</Data></Cell>"."\r\n";
    9.  $final.="</Row>";
    на че по-проще. я проверять не буд, думаю прокатит и так
    PHP:
    1. <?
    2.  $final.='<Row>'."\r\n";
    3.  $final.="<Cell><Data>$val</Data></Cell>"."\r\n";
    4.  $final.="<Cell><Data>" . (isset($data['phones'][0]) ? $data['phones'][0] : '') . "</Data></Cell>"."\r\n";
    5.  $final.="</Row>";
    должно получиться то же самое, но минус половина строк

    а нафига тебе эта xml-ка? БД может?