Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [inne][PHP]Algorytm zmieniający plik CSV
big200
post
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 4.06.2012

Ostrzeżenie: (0%)
-----


Witam,
Posiadam następujący problem otrzymuje plik CSV w formie:
Cytat
1;a
2;c
2;b
1;c
8;a

potrzebuje przekształcić do:
Cytat
1;a|c
2;c|b
8;a

Cały plik posiada ok 4000 rekordów. Wiem jak wczytać i zapisać CSV aczkolwiek nie mam pomysłu na ten algorytm. Z góry dziękuje za wskazówki.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
konrados
post
Post #2





Grupa: Zarejestrowani
Postów: 623
Pomógł: 79
Dołączył: 16.01.2008

Ostrzeżenie: (0%)
-----


1. funkcja $csv=str_getcsv : w wyniku tego masz np. array('1'=>'a','2'=>'c','2'=>'b')
2. tworzysz nowy array: $ar=array();
3. foreach ($ar as $key=>$val) sprawdzasz czy w nowej $ar już istnieje klucz $key, jak tak to dodajesz do niego "|$val" jak nie to tworzysz nowy $a[$key]=$val
4. zapisujesz: fputcsv

Ten post edytował konrados 29.07.2012, 09:59:30
Go to the top of the page
+Quote Post
big200
post
Post #3





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 4.06.2012

Ostrzeżenie: (0%)
-----


Ok napisałem działa tylko mam jakiś głupi problem z zapisem. Mój kod
  1. <?php
  2. $row = 1;
  3. $file2 = "bazakat2.csv";
  4. $fp2 = fopen($file2, "w+");
  5. $ar=array();
  6. if (($handle = fopen("bazakat.csv", "r")) !== FALSE) {
  7. while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
  8. $num = count($data);
  9. $row++;
  10. if (isset($ar[$data[0]])){
  11. $ar[$data[0]]=(string)$ar[$data[0]].'|'.(string)$data[1];
  12. }else{
  13. $ar[$data[0]]=$data[1];
  14. }
  15. }
  16. print_r($ar);
  17. fputcsv($fp2, $ar);
  18. fclose($handle);
  19. }
  20. ?>

I tak print_f wyswietla
Cytat
Array ( [NRTOW] => IDGRPN [0] => 0 [4759] => 5|49 [1] => 5|49 [2] => 49 [3] => 5|49 [4] => 5|49 [5] => 49 [6] => 49 [7] => 5|49 [8] => 5|49 [9] => 5|49 [10] => 5|49 [11] => 5|49 [12] => 5|49 [13] => 49 [14] => 5 [15] => 5|49 [16] => 5|49 [17] => 5|49 [18] => 5|49 [19] => 5|49 [20] => 5|49 [21] => 5|49 [22] => 5|49 [23] => 5|49 [24] => 5|49 [25] => 5|26|28 [26] => 5|67|1 [27] => 5|1 [28] => 5|67|1
czyli prawodłowo
Jak zapisuje fputcsv($fp2, $ar); to plik CSV zawiera:
Cytat
IDGRPN,0,5|49,5|49,49,5|49,5|49,49,49,5|49,5|49,5|49,5|49,5|49,5|49,49,5,5|49,5|
49,5|49,5|49,5|49,5|49,5|49,5|49,5|49,5|49,5|26|28,5|67|1,5|1,5|67|1,
Czyli same wartość. Z góry dzięki za jakieś wskazówki co robię źle.

OK Działa zrobiłem to tak:

  1. <?php
  2. $row = 1;
  3. $file2 = "bazakat2.csv";
  4. $fp2 = fopen($file2, "w+");
  5. $ar=array();
  6. if (($handle = fopen("bazakat.csv", "r")) !== FALSE) {
  7. while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
  8. $num = count($data);
  9. $row++;
  10.  
  11.  
  12.  
  13. if (isset($ar[$data[0]])){
  14. $ar[$data[0]]=(string)$ar[$data[0]].'|'.(string)$data[1];
  15.  
  16. }else{
  17. $ar[$data[0]]=$data[1];
  18.  
  19. }
  20.  
  21. }
  22.  
  23. fclose($handle);
  24.  
  25. }
  26.  
  27. foreach ($ar as $key => $value) {
  28. $tekst = $key.";".$value." \r\n"; //Kolejne rzędy do pliku wynikowego CSV
  29. fwrite($fp2, $tekst);
  30. }
  31.  
  32. ?>
  33.  


Ten post edytował big200 30.07.2012, 09:07:57
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 13:15