Демонстрация того, как можно "руками" разобрать CSV файл. Практической пользы не имеет, но по его примеру можно обрабатывать и другие форматы.
Класс для ручной разборки и сохранения CSV файлов
16.11.2015
csv.php (Download)
<? class c_csv { var $_data = ''; ///свойство было =NULL; var $_bSkipFirstLine = false; var $_FileName = ''; function c_csv($FileName) ///метод { $this->_FileName = $FileName; } function Load() { $this->_data = file($this->_FileName); //возвращает одномерный массив просто из строк $lines = array(); // временная переменная массива (чистая тетрадка) $i = 0; foreach($this->_data as $line) //исписанная тетрадка as страница в исписанной тетрадке { if ($this->_bSkipFirstLine == true AND $i==0) { // do nothing } else { $lines[$i] = explode (";" , $line ) ; // присвоение, возвращает массив в массиве (взяли страницу чистой тетрадки и записали туда значения из аналогичной страницы исписанной тетрадки) } $i++; } $this->_data = $lines; } function Save() { $lines = array(); //моя новая исписанная тетрадка, мой журнал в деканате. $i = 0; foreach ($this->_data as $mine) //беру свою тетрадку и перебираю как мне нравится { $lines[$i] = implode(";", $mine); //беру свою исписанную тетрадку и записываю в журнал в деканате $i++; } // $this->_data = implode("", $lines); /// изменённую тетрадку превращаю в строку $this->_data = implode("\n", $lines); /// изменённую тетрадку превращаю в строку $sContent = $this->_data; /// новой переменной присваиваю єту строку //$sContent = implode("", $this->_data); if (!$handle = fopen($this->_FileName, 'w+')) { die('Не могу открыть файл ('.$this->_FileName.')'); } if (fwrite($handle, $sContent) === FALSE) { die('Не могу произвести запись в файл ('.$this->_FileName.')'); } fclose($handle); } function GetAsArray() { return $this->_data; // echo '<pre>'; //print_r($lines); // Вывод полученного результата //echo '</pre>'; } function SetAsArray($Array) { $this->_data = $Array; //echo '<pre>'; //print_r($this->_data); // Вывод полученного результата //echo '</pre>'; } function setSkipFirstLine($value) { $this->_bSkipFirstLine = $value; } function Demo() { $oCSV = new c_csv('test.csv'); //можно вызывать сразу этот файл, еси есть конструктор //$oCSV->Create('test.csv'); $oCSV->setSkipFirstLine(true); $oCSV->Load(); //$oCSV->GetAsArray(); $aResult = $oCSV->GetAsArray(); //print_r ($aResult[1][2]); //первая хрень - один массив, к нему обращаюсь, вторая хрень - это уже внутри массива $aResult[1][2] = '999'; ///поменяли значение , в массиве он уже изменён // print_r ($aResult); $oCSV->SetAsArray($aResult); //вызов метода $oCSV->Save(); } } ?>