Edit: Originally I simplified the original csv file (from com1_webscrapersolution_new_email-10-02-20.csv
to products.csv
) to minimise/simplify the question, but it turned out the file name is of consequence here and is key to the solution. I have edited the question in such a way to make this apparent. I have also added an answer without an known explanation which I'm hoping someone else can provide.
For the following problem, I can confirm that
/folder/custom_csv_parsing_functions.php
exists, the relevant excerpt is shown belowI am running the PHP in bash as php -f file.php
.
file.php
:
<?php
include('/folder/custom_csv_parsing_functions.php');
$out = '/c1/com1_webscrapersolution_new_email-10-02-20.csv';
//ENCLOSE HD DQUOTE
$in = $out;
$out = str_replace('.csv','_enc_hd.csv',$in);
enclose_headers_dquote($in,$out);
throws the error:
fopen('
/c1/products.csvcom1_webscrapersolution_new_email-10-02-20.csv'): failed to open stream: No such file or directory in /folder/custom_csv_parsing_functions.php on line 58
Excerpt from /folder/custom_csv_parsing_functions.php
:
//removed code here as this is an excerpt
function enclose_headers_dquote($csv_input_file, $csv_output_file){
$line = fgets(fopen($csv_input_file, 'r')); //this is line 58
$line = str_replace("\r\n", '', $line);
$arr = explode(',', $line);
$header = '"' . implode('","', $arr) . '"';
$header = array(
$header
);
$fulltext = file_get_contents($csv_input_file);
$fulltext = explode("\r\n", $fulltext);
array_shift($fulltext);
$reconstituted_csv_array = array_merge($header, $fulltext);
$reconstituted_csv_str = implode("\r\n", $reconstituted_csv_array);
file_put_contents($csv_output_file, $reconstituted_csv_str);
}
If the file products.csvcom1_webscrapersolution_new_email-10-02-20.csv exists, and is set to 777 permissions, why is PHP reporting "fopen('/c1/products.csvcom1_webscrapersolution_new_email-10-02-20.csv'): failed to open stream: No such file or directory"?
Further, I can confirm that running the PHP directly in bash interactive shell does succeed:
[root@server c1]# php -a
Interactive shell
php > include('/folder/custom_csv_parsing_functions.php');
php > enclose_headers_dquote('/c1/com1_webscrapersolution_new_email-10-02-20.csv','/c1/com1_webscrapersolution_new_email-10-02-20_enc_hd.csv');
Successful output is /c1/com1_webscrapersolution_new_email-10-02-20_enc_hd.csv
(can be viewed here).
So why doesn't it work when running the PHP in bash as php -f file.php
?
I do not understand why but this works, and I will have to edit the original question accordingly.
Unfortunately, in trying to comply with minimal example I renamed the actual name of the csv file from com1_webscrapersolution_new_email-10-02-20.csv
to products.csv
in order to simplify the name, thinking this difference was of no consequence.
When I renamed to com1.csv
, it worked. I'm assuming it has to do with the complexity of all the character types in the name and the way it is parsed or some such.
I have no idea why this difference makes a difference? Have I violated rules of file naming in Linux? Both dashes, numbers and underscores are all legal in Linux file names, no?
I have even explicitly passed the name as '\'c1/com1_webscrapersolution_new_email-10-02-20.csv\''
so the argument value provided would be explicitly enclosed in single quotes.