可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a csv file which looks like this
$lines[0] = \"text, with commas\", \"another text\", 123, \"text\",5;
$lines[1] = \"some without commas\", \"another text\", 123, \"text\";
$lines[2] = \"some text with commas or no\",, 123, \"text\";
And I would like to have a table:
$t[0] = array(\"text, with commas\", \"another text\", \"123\", \"text\",\"5\");
$t[1] = array(\"some without commas\", \"another text\", \"123\", \"text\");
$t[2] = array(\"some text, with comma,s or no\", NULL , \"123\", \"text\");
If I use split($lines[0],\",\")
I\'ll get \"text\" ,\"with commas\" ...
Is there any elegant way to do it?
回答1:
You can use fgetcsv
to parse a CSV file without having to worry about parsing it yourself.
Example from PHP Manual:
$row = 1;
if (($handle = fopen(\"test.csv\", \"r\")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, \",\")) !== FALSE) {
$num = count($data);
echo \"<p> $num fields in line $row: <br /></p>\\n\";
$row++;
for ($c=0; $c < $num; $c++) {
echo $data[$c] . \"<br />\\n\";
}
}
fclose($handle);
}
回答2:
In addition to Matt\'s suggestion, you can also use SplFileObject
to read in the file:
$file = new SplFileObject(\"data.csv\");
$file->setFlags(SplFileObject::READ_CSV);
$file->setCsvControl(\',\', \'\"\', \'\\\\\'); // this is the default anyway though
foreach ($file as $row) {
list ($fruit, $quantity) = $row;
// Do something with values
}
source: http://de.php.net/manual/en/splfileobject.setcsvcontrol.php
回答3:
here is also a simple method to get read csv file.
$sfp = fopen(\'/path/to/source.csv\',\'r\');
$dfp = fopen(\'/path/to/destination.csv\',\'w\');
while ($row = fgetcsv($sfp,10000,\",\",\"\")) {
$goodstuff = \"\";
$goodstuff = str_replace(\"¦\",\",\",$row[2]);
$goodstuff .= \"\\n\";
fwrite($dfp,$goodstuff);
}
fclose($sfp);
fclose($dfp);
回答4:
Suppose you have a create a function for same things, Then it should look like
function csvtoarray($filename=\'\', $delimiter){
if(!file_exists($filename) || !is_readable($filename)) return FALSE;
$header = NULL;
$data = array();
if (($handle = fopen($filename, \'r\')) !== FALSE ) {
while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
{
if(!$header){
$header = $row;
}else{
$data[] = array_combine($header, $row);
}
}
fclose($handle);
}
if(file_exists($filename)) @unlink($filename);
return $data;
}
$data = csvtoarray(\'file.csv\', \',\');
print_r($data);
回答5:
Maybe my code solves your problem:
// Parse all content from csv file and generate array from line.
function csv_content_parser($content) {
foreach (explode(\"\\n\", $content) as $line) {
// Generator saves state and can be resumed when the next value is required.
yield str_getcsv($line);
}
}
// Get content from csv file.
$content = file_get_contents(\'your_file.csv\');
// Create one array from csv file\'s lines.
$data = array();
foreach (csv_content_parser($content) as $fields) {
array_push($data, $fields);
}
In result you have an array with all values from csv.
It would be something like:
Array
(
[0] => Array
(
[0] => text, with commas
[1] => another text
[2] => 123
[3] => text
[4] => 5
)
[1] => Array
(
[0] => some without commas
[1] => another text
[2] => 123
[3] => text
)
[2] => Array
(
[0] => some text, with comma,s or no
[1] => NULL
[2] => 123
[3] => text
)
)
回答6:
you can read the data using the following function.
function readCSV() {
$csv = array_map(\'str_getcsv\', file(\'data.csv\'));
array_shift($csv); //remove headers
}
http://www.pearlbells.co.uk/how-to-sort-a1a2-z9z10aa1aa2-az9az10-using-php/
回答7:
You could use something like https://github.com/htmlburger/carbon-csv that allows column mapping:
$csv = new \\Carbon_CSV\\CsvFile(\'path-to-file/filename.csv\');
$csv->set_column_names([
0 => \'first_name\',
1 => \'last_name\',
2 => \'company_name\',
3 => \'address\',
]);
foreach ($csv as $row) {
print_r($row);
}
The result of the below code would be something like:
Array
(
[0] => Array
(
[first_name] => John
[last_name] => Doe
[company_name] => Simple Company Name
[address] => Street Name, 1234, City Name, Country Name
)
[1] => Array
(
[first_name] => Jane
[last_name] => Doe
[company_name] => Nice Company Name
[address] => Street Name, 5678, City Name, Country Name
)
)
Another library that does the same thing(and much more) is http://csv.thephpleague.com/9.0/reader/
回答8:
When you want to keep the index (first line) for multidimensional result array, you can use:
$delim = \';\';
$csvFile = file($csv_file);
$firstline = str_getcsv($csvFile[0], $delim);
$data = array();
foreach ($csvFile as $line) {
$line = str_getcsv($line, $delim);
$data[] = array_combine($firstline, $line);
}
回答9:
I\'ve built an application to extract data from a CSV file , this php application was used to show a daily quote for users.
The full project on github: 365-quotes-php-csv.
Also this is the class Code for the application i\'ve built
<?php
/*
Main Class
please note :
1- the CSV file must be comma separated (,) and each line must End with (;).
2- Feel free to edit the all.CSV file and add all of your 366 New Quotes.
3- don\'t change any thing specially the CSV file Location.
---------------------------------------------------------------------------
RISS.WORK all copy rights reserved 2018
please Don\'t Remove
Github/RissWork
Email : info@riss.work
*/
class Quote{
//properties
private $_quote,$_allQuotes;
private static $_instance = null;
//Constructor
private function __construct(){
//Day Count
$dayCount = date(z);
if($this->readCsvAndGetQuote($dayCount)){
return $this->getQuote();
}else{
echo \'Error Cannot open the .CSV File\';
}
}
//Methods
//get Instance
public function getInstance(){
if(!isset(self::$_instance)){
self::$_instance = new Quote();
}
return self::$_instance;
}//end of get Instance
//get daily Quote
public function getQuote(){
return $this->_quote;
}//end of get Quote
//Read CSV
private function readCsvAndGetQuote($dayCount = 1 ){
if(($handel = fopen(\"csv/all.csv\" , \"r\")) !== false){
$this->_allQuotes = fgetcsv($handel,1000000,\';\');
$this->_quote = explode(\',\',$this->_allQuotes[$dayCount]);
return true;
}
return false;
}//end of read CSV
}//end of Class