jb-data.de/lib/SimpleExcel/Parser/CSVParser.php
2025-08-11 22:23:30 +02:00

124 lines
2.5 KiB
PHP

<?php
namespace SimpleExcel\Parser;
use SimpleExcel\Exception\SimpleExcelException;
/**
* SimpleExcel class for parsing Microsoft Excel CSV Spreadsheet
*
* @author Faisalman
* @package SimpleExcel
*/
class CSVParser extends BaseParser implements IParser
{
/**
* Defines delimiter character
*
* @access protected
* @var string
*/
protected $delimiter;
/**
* Defines valid file extension
*
* @access protected
* @var string
*/
protected $file_extension = 'csv';
/**
* Load the CSV file to be parsed
*
* @param string $file_path Path to CSV file
*/
public function loadFile($file_path){
if (!$this->isFileReady($file_path)) {
return;
}
$this->loadString(file_get_contents($file_path));
}
/**
* Load the string to be parsed
*
* @param string $str String with CSV format
*/
public function loadString($str){
$this->table_arr = array();
// 1. Split into lines by newline http://stackoverflow.com/questions/3997336/explode-php-string-by-new-line
$pattern = "/\r\n|\n|\r/";
$lines = preg_split($pattern, $str, -1, PREG_SPLIT_NO_EMPTY);
$total = count($lines);
// There are no lines to parse
if ($total == 0) {
return;
}
// 2. Guess delimiter if none set
$line = $lines[0];
if (!isset($this->delimiter)) {
// do guess work
$separators = array(';' => 0, ',' => 0);
foreach ($separators as $sep => $count) {
$args = str_getcsv($sep, $line);
$count = count($args);
$separators[$sep] = $count;
}
$sep = ',';
if (($separators[';'] > $separators[','])) {
$sep = ';';
}
$this->delimiter = $sep;
}
// 3. Parse the lines into rows,cols
$max = 0;
$min = PHP_INT_MAX;
$cols = 0;
$sep = $this->delimiter;
$rows = array();
foreach ($lines as $line) {
$args = str_getcsv($line, $sep);
$rows[] = $args;
$cols = count($args);
if ($cols > $max) {
$max = $cols;
}
if ($cols < $min) {
$min = $cols;
}
}
// 4. Expand those rows which have less cols than max cols found
if ($min != $max) {
foreach ($rows as $i => $row) {
$c = count($row);
while ($c < $max) {
$row[] = ""; // fill with empty strings
$c += 1;
}
$rows[$i] = $row;
}
}
$this->table_arr = $rows;
}
/**
* Set delimiter that should be used to parse CSV document
*
* @param string $delimiter Delimiter character
*/
public function setDelimiter($delimiter){
$this->delimiter = $delimiter;
}
}