|
<?php |
|
|
|
namespace Kanboard\Core; |
|
|
|
use SplFileObject; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Csv |
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
private $delimiter = ','; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private $enclosure = '"'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private $columns = array(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function __construct($delimiter = ',', $enclosure = '"') |
|
{ |
|
$this->delimiter = $delimiter; |
|
$this->enclosure = $enclosure; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function getDelimiters() |
|
{ |
|
return array( |
|
',' => t('Comma'), |
|
';' => t('Semi-colon'), |
|
'\t' => t('Tab'), |
|
'|' => t('Vertical bar'), |
|
); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function getEnclosures() |
|
{ |
|
return array( |
|
'"' => t('Double Quote'), |
|
"'" => t('Single Quote'), |
|
'' => t('None'), |
|
); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function getBooleanValue($value) |
|
{ |
|
if (! empty($value)) { |
|
$value = trim(strtolower($value)); |
|
return $value === '1' || $value[0] === 't' || $value[0] === 'y' ? 1 : 0; |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function output(array $rows) |
|
{ |
|
$csv = new static; |
|
$csv->write('php://output', $rows); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function setColumnMapping(array $columns) |
|
{ |
|
$this->columns = $columns; |
|
return $this; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function read($filename, $callback) |
|
{ |
|
$file = new SplFileObject($filename); |
|
$file->setFlags(SplFileObject::READ_CSV); |
|
$file->setCsvControl($this->delimiter, $this->enclosure); |
|
$line_number = 0; |
|
|
|
foreach ($file as $row) { |
|
$row = $this->filterRow($row); |
|
|
|
if (! empty($row) && $line_number > 0) { |
|
call_user_func_array($callback, array($this->associateColumns($row), $line_number)); |
|
} |
|
|
|
$line_number++; |
|
} |
|
|
|
return $this; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function write($filename, array $rows) |
|
{ |
|
$fp = fopen($filename, 'w'); |
|
|
|
if (is_resource($fp)) { |
|
foreach ($rows as $row) { |
|
fputcsv($fp, $row, $this->delimiter, $this->enclosure); |
|
} |
|
|
|
fclose($fp); |
|
} |
|
|
|
return $this; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private function associateColumns(array $row) |
|
{ |
|
$line = array(); |
|
$index = 0; |
|
|
|
foreach ($this->columns as $sql_name => $csv_name) { |
|
if (isset($row[$index])) { |
|
$line[$sql_name] = $row[$index]; |
|
} else { |
|
$line[$sql_name] = ''; |
|
} |
|
|
|
$index++; |
|
} |
|
|
|
return $line; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private function filterRow(array $row) |
|
{ |
|
return array_filter($row); |
|
} |
|
} |
|
|