Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

João Batista Neto

[Resolvido] CSVIterator

Recommended Posts

Supondo um arquivo CSV assim:

1,0,2009-12-01 13:00:00
2,1,2009-12-01 13:00:00
3,0,2009-12-02 21:05:00

Três linhas, cada linha com três colunas.

 

require 'CSVIterator.php';

foreach ( new CSVIterator( 'cadastros.csv' ) as $line ){
echo 'A primeira coluna contém: ' , $line[ 0 ] , PHP_EOL;
echo 'A segunda coluna contém: ' , $line[ 1 ] , PHP_EOL;
echo 'A terceira coluna contém: ' , $line[ 2 ] , PHP_EOL;
echo '-------------------------------------------------------' , PHP_EOL;
}

 

A saída será:

A primeira coluna contém: 1
A segunda coluna contém: 0
A terceira coluna contém: 2009-12-01 13:00:00
-------------------------------------------------------
A primeira coluna contém: 2
A segunda coluna contém: 1
A terceira coluna contém: 2009-12-01 13:00:00
-------------------------------------------------------
A primeira coluna contém: 3
A segunda coluna contém: 0
A terceira coluna contém: 2009-12-02 21:05:00
-------------------------------------------------------

CSVIterator.php

<?php
/**
* Comma Separated Values Iterator
* @author		João Batista Neto
* @category	file, csv, Iterator
*/
class CSVIterator extends ArrayIterator {
/**
 * @var string
 */
private $file;

/**
 * @var string
 */
private $delimiter = ',';

/**
 * @var string
 */
private $enclosure = '"';

/**
 * @var string
 */
private $escape = '\\';

/**
 * @param string $file O nome do arquivo CSV
 * @param string $delimiter O caracter utilizado para separar os campos
 * @param string $enclosure<p>O caracter utilizado para envolver o campo
 * caso este utilize algum caracter especial</p>
 * @param string $escape O caracter utilizado para escapar algum caracter especial
 */
public function __construct( $file , $delimiter = ',' , $enclosure = '"' , $escape = '\\' ){
	if ( is_file( $file ) && is_readable( $file ) ){
		$this->file =& $file;
		$this->setDelimiter( &$delimiter );
		$this->setEnclosure( &$enclosure );
		$this->setEscape( &$escape );

		parent::__construct( file( $file ) );
	} else {
		throw new InvalidArgumentException( sprintf( 'O arquivo %s não existe ou não temos permissão de leitura.' , $file ) );
	}
}

/**
 * Recupera a linha atual do arquivo
 * @return array
 */
public function current(){
	return str_getcsv( parent::current() , $this->delimiter , $this->enclosure , $this->escape );
}

/**
 * Recupera o nome do arquivo
 * @return string
 */
public function getFilename(){
	return $this->file;
}

/**
 * Define o caracter utilizado para separar os campos
 * @param string $delimiter
 */
public function setDelimiter( $delimiter ){
	$this->testArgument( $delimiter );

	$this->delimiter =& $delimiter;
}

/**
 * O caracter utilizado para envolver o campo caso este utilize algum caracter especial
 * @param string $enclosure
 */
public function setEnclosure( $enclosure ){
	$this->testArgument( $enclosure );

	$this->enclosure =& $enclosure;
}

/**
 * O caracter utilizado para escapar algum caracter especial
 * @param string $escape
 */
public function setEscape( $escape ){
	$this->testArgument( $escape );

	$this->escape =& $escape;
}

/**
 * Verifica se o argumento é válido
 * @param string $argument
 * @return boolean
 * @throws InvalidArgumentException caso o argumento seja inválido
 */
private function testArgument( &$argument ){
	if ( !is_string( $argument ) || strlen( $argument ) != 1 )
		throw new InvalidArgumentException( 'A argumento deve ter apenas 1 caracter' );

	return true;
}
}

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.