J'ai un fichier csv qui ressemble à ceci
$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";
Et j'aimerais avoir une 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");
Si j'utilise split($lines[0],",")
, j'obtiens "text" ,"with commas" ...
Existe-t-il un moyen élégant de le faire?
Vous pouvez utiliser fgetcsv
pour analyser un fichier CSV sans avoir à vous soucier de l’analyser vous-même.
Exemple de 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);
}
En plus de suggestion de Matt , vous pouvez également utiliser SplFileObject
pour lire dans le fichier:
$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
voici également une méthode simple pour lire le fichier csv.
$ sfp = fopen ('/ chemin/vers/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);
Peut-être que mon code résoud votre problème:
// 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);
}
En résultat, vous avez un tableau avec toutes les valeurs de csv. Ce serait quelque chose comme:
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
)
)
Supposons que vous ayez créé une fonction pour les mêmes choses, alors elle devrait ressembler à
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);
vous pouvez lire les données en utilisant la fonction suivante.
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/
Vous pouvez utiliser quelque chose comme https://github.com/htmlburger/carbon-csv qui permet le mappage de colonnes:
$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);
}
Le résultat du code ci-dessous serait quelque chose comme:
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
)
)
Une autre bibliothèque qui fait la même chose (et bien d’autres choses encore) est http://csv.thephpleague.com/9.0/reader/
J'ai construit une application pour extraire des données d'un fichier CSV. Cette application php était utilisée pour afficher un devis quotidien pour les utilisateurs.
Le projet complet sur github: 365-quotes-php-csv .
C'est aussi le code de classe de l'application que j'ai construite
<?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 : [email protected]
*/
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
Lorsque vous souhaitez conserver l'index (première ligne) du tableau de résultats multidimensionnel, vous pouvez utiliser:
$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);
}