1. PHP / Говнокод #7694

    +162

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    /*
    	Функция для парсинга CSV файла. 
    	Автор: Федорченко Антон Александрович ([email protected], http://sites.neeweb.com/antfsite)
    	
    	Возвращает двумерный массив:
    		array(
    			array ( ... )	//Строка 1
    			array ( ... )	//Строка 2
    			...
    			array ( ... )	//Строка n
    			)
    */
    
    function parse_csv($filename, $codepage = 'windows-1251') {
        $csv_lines  = file($filename);
        $skip_char = false;
        $column = '';
        if (is_array($csv_lines)) {
            $cnt = count($csv_lines);
            for($i = 0; $i < $cnt; $i++) {
                $line = trim($csv_lines[$i]);
                $first_char = true;
                $col_num = 0;
                $length = strlen($line);
                for ($b = 0; $b < $length; $b ++) {
                    if ($skip_char != true) {
                        $process = true;
                        if ($first_char == true) {
                            if($line[$b] == '"') {
                                $terminator = '";';
                                $process = false;
                            } else {
                                $terminator = ';';
                            }
                            $first_char = false;
                        }
                        if ($line[$b] == '"') {
                            $next_char = $line[$b + 1];
                            if ($next_char == '"') {
                                $skip_char = true;
                            } elseif ($next_char == ';') {
                                if($terminator == '";') {
                                    $first_char = true;
                                    $process = false;
                                    $skip_char = true;
                                }
                            }
                        }
                        if ($process == true) {
                            if ($line[$b] == ';') {
                                if ($terminator == ';') {
                                    $first_char = true;
                                    $process = false;
                                }
                            }
                        }
                        if ($process == true) $column .= $line[$b];
                        if ($b == ($length - 1)) $first_char = true;
                        if ($first_char == true) {
                            $values[$i][$col_num] = $column;
                            $column = '';
                            $col_num ++;
                        }
                    } else {
                        $skip_char = false;
                    }
                }
            }
        }
        if (strtolower($codepage) != "utf-8") {
            foreach ($values as $lineIndex => $line) {
                foreach ($line as $cellIndex => $cell) $values[$lineIndex][$cellIndex] = iconv($codepage, "UTF-8", $cell);
            }
        }
        return $values;
    }

    Жаль, не пришло в голову запостить сразу - ОНО ещё и неотворматировано было.
    Антон Александрович - мощный дядька =)

    Запостил: cybervantyz, 30 Августа 2011

    Комментарии (21) RSS

    • > $terminator
      http://proc.com.ua/uploads/posts/1206962015_picture.jpg
      Ответить
      • Чувак, терминатор - это "разделитель" (или "прерыватель"), так что всё правильно.
        Ответить
      • Читаю про "терминатора" на работе...
        Вокруг люди сидят, трудятся - ржать немного неудобно. Но приходится...
        Ответить
    • Жёсткая inline-оптимизация. Надо было ещё и unroll циклов сделать для пущей красоты.
      Ответить
    • fgetcsv()
      Ответить
    • if ($b == ($length - 1)) $first_char = true;
      if ($first_char == true) {

      Не ну крассиво. Индуссы рукоплещут.
      Ответить
    • нормальный код. причем (похоже) будет корректно парсит экселовские документы.

      указаная выше fgetcsv() - тыкайте здесь https://bugs.php.net/bug.php?id=50686 - сама похоже говно.
      Ответить
      • Это всё очень печально.
        Ответить
        • CSV говно по определению. сам в древние времена парсер писал на перле. как только в объявлении функции fgetcsv() увидел escape character сразу заподозрил неладное: люди наверное думали головой когда эту функцию писали. вместо этого надо было думать тем же местом которым разработчики эксела думали...
          Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий