Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inne][PHP]Algorytm zmieniający plik CSV
Forum PHP.pl > Forum > Przedszkole
big200
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.
konrados
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
big200
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.  
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.