Демонстрация того, как можно "руками" разобрать 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();
}
}
?>