modifs.mineures sans commentaires
This commit is contained in:
parent
98fcd799c7
commit
7f378c6b8f
23
src/cl.php
23
src/cl.php
|
@ -196,6 +196,29 @@ class cl {
|
|||
return $dest;
|
||||
}
|
||||
|
||||
/**
|
||||
* obtenir la liste des clés finalement obtenues après l'appel à
|
||||
* {@link self::select()} avec le mapping spécifié
|
||||
*/
|
||||
static final function selected_keys(?array $mappings): array {
|
||||
if ($mappings === null) return [];
|
||||
$keys = [];
|
||||
$index = 0;
|
||||
foreach ($mappings as $to => $from) {
|
||||
if ($to === $index) {
|
||||
if ($from === false) continue;
|
||||
elseif ($from === null) $keys[] = $index;
|
||||
else $keys[] = $from;
|
||||
$index++;
|
||||
} elseif ($from === false) {
|
||||
continue;
|
||||
} else {
|
||||
$keys[] = $to;
|
||||
}
|
||||
}
|
||||
return $keys;
|
||||
}
|
||||
|
||||
/**
|
||||
* méthode de convenance qui sélectionne certaines clés de $array avec
|
||||
* {@link self::select()} puis merge le tableau $merge au résultat.
|
||||
|
|
|
@ -22,10 +22,10 @@ class SpoutBuilder extends AbstractBuilder {
|
|||
const DATETIME_FORMAT = "mm/dd/yyyy hh:mm:ss";
|
||||
|
||||
/** @var bool faut-il choisir le type numérique pour une chaine numérique? */
|
||||
const PARSE_NUMERIC = true;
|
||||
const TYPE_NUMERIC = true;
|
||||
|
||||
/** @var bool faut-il choisir le type date pour une chaine au bon format? */
|
||||
const PARSE_DATE = true;
|
||||
const TYPE_DATE = true;
|
||||
|
||||
/** @var string|int|null nom de la feuille dans laquelle écrire */
|
||||
const WSNAME = null;
|
||||
|
@ -56,17 +56,17 @@ class SpoutBuilder extends AbstractBuilder {
|
|||
$ss->setDefaultColumnWidth(10.5);
|
||||
$ss->writeToStream($this->getResource());
|
||||
$this->ss = $ss;
|
||||
$this->parseNumeric = boolval($params["parse_numeric"] ?? static::PARSE_NUMERIC);
|
||||
$this->parseDate = boolval($params["parse_date"] ?? static::PARSE_DATE);
|
||||
$this->typeNumeric = boolval($params["type_numeric"] ?? static::TYPE_NUMERIC);
|
||||
$this->typeDate = boolval($params["type_date"] ?? static::TYPE_DATE);
|
||||
$this->firstSheet = true;
|
||||
$this->setWsname($params["wsname"] ?? static::WSNAME);
|
||||
}
|
||||
|
||||
protected WriterMultiSheetsAbstract $ss;
|
||||
|
||||
protected bool $parseNumeric;
|
||||
protected bool $typeNumeric;
|
||||
|
||||
protected bool $parseDate;
|
||||
protected bool $typeDate;
|
||||
|
||||
const STYLE_ROW = 0, STYLE_HEADER = 1;
|
||||
|
||||
|
@ -94,7 +94,7 @@ class SpoutBuilder extends AbstractBuilder {
|
|||
}
|
||||
|
||||
protected function isNumeric($value): bool {
|
||||
if ($this->parseNumeric && is_numeric($value)) return true;
|
||||
if ($this->typeNumeric && is_numeric($value)) return true;
|
||||
if (!is_string($value) && is_numeric($value)) return true;
|
||||
return false;
|
||||
}
|
||||
|
@ -104,7 +104,7 @@ class SpoutBuilder extends AbstractBuilder {
|
|||
$style = (new Style())->setFormat(self::DATE_FORMAT);
|
||||
return true;
|
||||
}
|
||||
if (!is_string($value)) return false;
|
||||
if (!is_string($value) || !$this->typeDate) return false;
|
||||
if (DateTime::isa_datetime($value, true)) {
|
||||
$value = new DateTime($value);
|
||||
$style = (new Style())->setFormat(self::DATETIME_FORMAT);
|
||||
|
|
|
@ -12,13 +12,35 @@ abstract class AbstractReader implements IReader {
|
|||
/** @var ?string nom du fichier depuis lequel lire */
|
||||
const INPUT = null;
|
||||
|
||||
/** @var bool faut-il trimmer le champ avant de le traiter? */
|
||||
const TRIM = true;
|
||||
|
||||
/** @var bool faut-il considérer les chaines vides comme null? */
|
||||
const PARSE_EMPTY_AS_NULL = true;
|
||||
|
||||
/**
|
||||
* @var bool faut-il forcer le type numérique pour une chaine numérique?
|
||||
* si false, ne forcer le type numérique que si la chaine ne commence pas zéro
|
||||
* i.e "06" est une chaine, alors "63" est un nombre
|
||||
*/
|
||||
const PARSE_NUMERIC = false;
|
||||
|
||||
/**
|
||||
* @var bool faut-il forcer le type {@link Date} ou {@link DateTime} pour une
|
||||
* chaine au bon format?
|
||||
*/
|
||||
const PARSE_DATE = true;
|
||||
|
||||
function __construct($input, ?array $params=null) {
|
||||
if ($input !== null) $params["input"] = $input;
|
||||
#
|
||||
$this->schema = $params["schema"] ?? static::SCHEMA;
|
||||
$this->headers = $params["headers"] ?? static::HEADERS;
|
||||
$this->input = $params["input"] ?? static::INPUT;
|
||||
$this->parseEmptyAsNull = boolval($params["empty_as_null"] ?? true);
|
||||
$this->trim = boolval($params["trim"] ?? static::TRIM);
|
||||
$this->parseEmptyAsNull = boolval($params["empty_as_null"] ?? static::PARSE_EMPTY_AS_NULL);
|
||||
$this->parseNumeric = boolval($params["parse_numeric"] ?? static::PARSE_NUMERIC);
|
||||
$this->parseDate = boolval($params["parse_date"] ?? static::PARSE_DATE);
|
||||
}
|
||||
|
||||
protected ?array $schema;
|
||||
|
@ -27,8 +49,14 @@ abstract class AbstractReader implements IReader {
|
|||
|
||||
protected $input;
|
||||
|
||||
protected bool $trim;
|
||||
|
||||
protected bool $parseEmptyAsNull;
|
||||
|
||||
protected bool $parseNumeric;
|
||||
|
||||
protected bool $parseDate;
|
||||
|
||||
protected int $isrc = 0, $idest = 0;
|
||||
|
||||
protected function cook(array &$row): bool {
|
||||
|
@ -48,15 +76,32 @@ abstract class AbstractReader implements IReader {
|
|||
}
|
||||
|
||||
protected function verifixCol(&$col): void {
|
||||
if ($col === "" && $this->parseEmptyAsNull) {
|
||||
if ($this->trim && is_string($col)) {
|
||||
$col = trim($col);
|
||||
}
|
||||
if ($this->parseEmptyAsNull && $col === "") {
|
||||
# valeur vide --> null
|
||||
$col = null;
|
||||
} elseif (DateTime::isa_datetime($col, true)) {
|
||||
# datetime
|
||||
$col = new DateTime($col);
|
||||
} elseif (DateTime::isa_date($col, true)) {
|
||||
# date
|
||||
$col = new Date($col);
|
||||
}
|
||||
if (!is_string($col)) return;
|
||||
if ($this->parseDate) {
|
||||
if (DateTime::isa_datetime($col, true)) {
|
||||
# datetime
|
||||
$col = new DateTime($col);
|
||||
} elseif (DateTime::isa_date($col, true)) {
|
||||
# date
|
||||
$col = new Date($col);
|
||||
}
|
||||
if (!is_string($col)) return;
|
||||
}
|
||||
$parseNumeric = $this->parseNumeric || substr($col, 0, 1) !== "0";
|
||||
if ($parseNumeric) {
|
||||
$tmp = str_replace(",", ".", $col);
|
||||
$float = strpos($tmp, ".") !== false;
|
||||
if (is_numeric($tmp)) {
|
||||
if ($float) $col = floatval($tmp);
|
||||
else $col = intval($tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue