Разбор CSV-Файла в массив

4 Апреля 2018

В первую очередь, немного полезных ссылок:

- https://htmlweb.ru/php/function/fgetcsv.php – Описание функции разбора строки из CSV файла в массив.

- http://www.php.su/articles/?cat=fs&page=005 – Работа с файлами в php

- https://php.net/manual/ru/ref.array.php – Описание основных базовых функций работы с массивами в PHP. Очень важная страничка.

- http://dev.1c-bitrix.ru/api_help/ – Документация по большей части классов, методов и всего остального в Битриксе. В данном случае указано потому, что вся эта конитель с CSV требуется для кастомной интеграции с 1С. Короче чтобы не забыть, где и что лежит.


И так, у нас имеется .csv файл с некоторым заведомо корректным содержимым (корретный csv файл). Задача следующая - написать такую функцию (а может быть и класс), который бы приобразовывал входной csv файл в многомерный массив, эелементами которого были бы массивы, каждый из которых в свою очередь содержал бы n-ое количество записей в соответствии с кол-вом столбцов в файле, а в качестве ключей этих записей должны находиться заголовки столбцов, если первоя строка содержит заголовки, или просто порядковый номер столбца, если заголовки отсутсвутют. И так, поехали.


Перво-наперво нам нужно открыть наш файл на чтение. Давайте условимся, что требованием нашего скрипта является нахождение файла в папке import, которая находится в той же папке, что и скрипт.

  
	
	function getArrayFromCSV($filename = null, $has_names = true, $determiner = ";"){	
		$fp = fopen('import/' . $filename, 'r');
		
		if(!$filename){
			echo 'Не задано имя файла';
			return null;
		}
		
		if(!$determiner){
			$determiner = ';';
		}
		
		if($fp){
			$arrResult = Array(); //результирующий массив
			$arrTemplate = Array(); // массив с именами столбцов
			$row = 0; //счетчик строк
		
			while (($data = fgetcsv($fp, 1000, $determiner)) !== FALSE) {
				$num = count($data); //количество элементов в строке 
				
				
				if($has_names) {
					if($row == 0){
					
						$arrTemplate = $data;
						
					} else {
						$arr = array();
						
						for($i=0; $i<count($data); $i++){
							$arr[$arrTemplate[$i]] = $data[$i];
						}
						
						$arrResult[] = $arr;
					}
				} else {
					$arr = array();
						
					for($i=0; $i<count($data); $i++){
						$arr[] = $data[$i];
					}
					
					$arrResult[] = $arr;
				}
				
				$row++;
			}

			return $arrResult;
		} else {
			echo 'Не найден файл';
			return null;
		}
	}
	

Собтсвенно у функции getArrayFromCSV есть три параметра:
$filename — имя csv файла для разбора. Обязательный параметр.
$has_names — необязательный параметр. Указывает, содержит ли первая строка имена столбцов или нет. true - содержит. false - нет. По умолчанию true
$determiner — необязательный параметр. Разделитель текста для распаршивания файла. Поумолчанию точка с запятой


Результатом работы функции будет ассоциативный массив массивов либо null в случае ошибки.

Если файл в качестве первой строки таблицы содержит имена столбцов, то тогда эти имена будут ключами к соответствующим значениям в массивах.

Возврат к списку