-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathCsvFile.php
More file actions
85 lines (77 loc) · 2.66 KB
/
Copy pathCsvFile.php
File metadata and controls
85 lines (77 loc) · 2.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<?php declare(strict_types=1);
/*
* This file is part of the CleverAge/ProcessBundle package.
*
* Copyright (C) 2017-2021 Clever-Age
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace CleverAge\ProcessBundle\Filesystem;
/**
* Read and write CSV files through a simple API.
*
* @author Valentin Clavreul <vclavreul@clever-age.com>
* @author Vincent Chalnot <vchalnot@clever-age.com>
*/
class CsvFile extends CsvResource
{
/** @var string */
protected $filePath;
/**
* @param string $filePath Also accept a resource
* @param string $delimiter CSV delimiter
* @param string $enclosure
* @param string $escape
* @param array $headers Leave null to read the headers from the file
* @param string $mode Same parameter as the mode in the fopen function (r, w, a, etc.)
*
* @throws \RuntimeException
* @throws \UnexpectedValueException
*/
public function __construct(
$filePath,
$delimiter = ',',
$enclosure = '"',
$escape = '\\',
array $headers = null,
$mode = 'rb'
) {
$this->filePath = $filePath;
if (!\in_array($filePath, ['php://stdin', 'php://stdout', 'php://stderr'])) {
$dirname = \dirname($this->filePath);
if (!@mkdir($dirname, 0755, true) && !is_dir($dirname)) {
throw new \RuntimeException(sprintf('Directory "%s" was not created', $dirname));
}
}
$resource = fopen($filePath, $mode);
if (false === $resource) {
throw new \UnexpectedValueException("Unable to open file: '{$filePath}' in {$mode} mode");
}
// All modes allowing file reading, binary safe modes are handled by stripping out the b during test
$readAllowedModes = ['r', 'r+', 'w+', 'a+', 'x+', 'c+'];
if (null === $headers && !\in_array(str_replace('b', '', $mode), $readAllowedModes, true)) {
// Cannot read headers if the file was just created
throw new \UnexpectedValueException(
"Invalid headers for {$this->getResourceName()}, you need to pass the headers manually"
);
}
parent::__construct($resource, $delimiter, $enclosure, $escape, $headers);
}
/**
* Will return a resource if the file was created using a resource
*
* @return string|resource
*/
public function getFilePath(): string
{
return $this->filePath;
}
/**
* @return string
*/
protected function getResourceName(): string
{
return "CSV file '{$this->filePath}'";
}
}