Polyfill
10 months ago
AbstractCsv.php
10 months ago
ByteSequence.php
10 months ago
CannotInsertRecord.php
10 months ago
CharsetConverter.php
10 months ago
ColumnConsistency.php
10 months ago
EncloseField.php
10 months ago
EscapeFormula.php
10 months ago
Exception.php
10 months ago
HTMLConverter.php
10 months ago
Info.php
10 months ago
InvalidArgument.php
10 months ago
MapIterator.php
10 months ago
RFC4180Field.php
10 months ago
Reader.php
10 months ago
ResultSet.php
10 months ago
Statement.php
10 months ago
Stream.php
10 months ago
SyntaxError.php
10 months ago
TabularDataReader.php
10 months ago
UnableToProcessCsv.php
10 months ago
UnavailableFeature.php
10 months ago
UnavailableStream.php
10 months ago
Writer.php
10 months ago
XMLConverter.php
10 months ago
functions.php
10 months ago
functions_include.php
10 months ago
Info.php
76 lines
| 1 | <?php |
| 2 | |
| 3 | /** |
| 4 | * League.Csv (https://csv.thephpleague.com) |
| 5 | * |
| 6 | * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> |
| 7 | * |
| 8 | * For the full copyright and license information, please view the LICENSE |
| 9 | * file that was distributed with this source code. |
| 10 | */ |
| 11 | declare (strict_types=1); |
| 12 | namespace IAWPSCOPED\League\Csv; |
| 13 | |
| 14 | use function array_fill_keys; |
| 15 | use function array_filter; |
| 16 | use function array_reduce; |
| 17 | use function array_unique; |
| 18 | use function count; |
| 19 | use function iterator_to_array; |
| 20 | use function strlen; |
| 21 | use function strpos; |
| 22 | use const COUNT_RECURSIVE; |
| 23 | /** @internal */ |
| 24 | final class Info implements ByteSequence |
| 25 | { |
| 26 | private const BOM_SEQUENCE_LIST = [self::BOM_UTF32_BE, self::BOM_UTF32_LE, self::BOM_UTF16_BE, self::BOM_UTF16_LE, self::BOM_UTF8]; |
| 27 | /** |
| 28 | * Returns the BOM sequence found at the start of the string. |
| 29 | * |
| 30 | * If no valid BOM sequence is found an empty string is returned |
| 31 | */ |
| 32 | public static function fetchBOMSequence(string $str) : ?string |
| 33 | { |
| 34 | foreach (self::BOM_SEQUENCE_LIST as $sequence) { |
| 35 | if (0 === strpos($str, $sequence)) { |
| 36 | return $sequence; |
| 37 | } |
| 38 | } |
| 39 | return null; |
| 40 | } |
| 41 | /** |
| 42 | * Detect Delimiters usage in a {@link Reader} object. |
| 43 | * |
| 44 | * Returns a associative array where each key represents |
| 45 | * a submitted delimiter and each value the number CSV fields found |
| 46 | * when processing at most $limit CSV records with the given delimiter |
| 47 | * |
| 48 | * @param string[] $delimiters |
| 49 | * |
| 50 | * @return array<string, int> |
| 51 | */ |
| 52 | public static function getDelimiterStats(Reader $csv, array $delimiters, int $limit = 1) : array |
| 53 | { |
| 54 | $delimiterFilter = static function (string $value) : bool { |
| 55 | return 1 === strlen($value); |
| 56 | }; |
| 57 | $recordFilter = static function (array $record) : bool { |
| 58 | return 1 < count($record); |
| 59 | }; |
| 60 | $stmt = Statement::create()->offset(0)->limit($limit); |
| 61 | $delimiterStats = static function (array $stats, string $delimiter) use($csv, $stmt, $recordFilter) : array { |
| 62 | $csv->setDelimiter($delimiter); |
| 63 | $foundRecords = array_filter(iterator_to_array($stmt->process($csv)->getRecords(), \false), $recordFilter); |
| 64 | $stats[$delimiter] = count($foundRecords, COUNT_RECURSIVE); |
| 65 | return $stats; |
| 66 | }; |
| 67 | $currentDelimiter = $csv->getDelimiter(); |
| 68 | $currentHeaderOffset = $csv->getHeaderOffset(); |
| 69 | $csv->setHeaderOffset(null); |
| 70 | $stats = array_reduce(array_unique(array_filter($delimiters, $delimiterFilter)), $delimiterStats, array_fill_keys($delimiters, 0)); |
| 71 | $csv->setHeaderOffset($currentHeaderOffset); |
| 72 | $csv->setDelimiter($currentDelimiter); |
| 73 | return $stats; |
| 74 | } |
| 75 | } |
| 76 |