from - split csv php
Cómo crear una matriz a partir de un archivo CSV utilizando PHP y la función fgetcsv (11)
Como dijiste en tu título, fgetcsv es el camino a seguir. Es bastante fácil de usar.
$file = fopen(''myCSVFile.csv'', ''r'');
while (($line = fgetcsv($file)) !== FALSE) {
//$line is an array of the csv elements
print_r($line);
}
fclose($file);
Querrá poner más control de errores allí en caso de que falle fopen()
, pero esto funciona para leer un archivo CSV línea por línea y analizar la línea en una matriz.
¿Alguien puede proporcionar amablemente un código para crear una matriz a partir de un archivo CSV utilizando fgetcsv?
He utilizado el siguiente código para crear una matriz a partir de un archivo CSV simple, pero no funciona bien cuando uno de mis campos tiene varias comas, como direcciones.
$lines =file(''CSV Address.csv'');
foreach($lines as $data)
{
list($name[],$address[],$status[])
= explode('','',$data);
}
* Además, str_getcsv no es compatible con mi servicio de alojamiento.
El código anterior no funciona con el siguiente ejemplo de archivo CSV. La primera columna es el nombre, la segunda columna es la dirección, la tercera columna es el estado civil.
Scott L. Aranda,"123 Main Street, Bethesda, Maryland 20816",Single
Todd D. Smith,"987 Elm Street, Alexandria, Virginia 22301",Single
Edward M. Grass,"123 Main Street, Bethesda, Maryland 20816",Married
Aaron G. Frantz,"987 Elm Street, Alexandria, Virginia 22301",Married
Ryan V. Turner,"123 Main Street, Bethesda, Maryland 20816",Single
Creé una función que convertirá una cadena csv en una matriz. La función sabe cómo escapar caracteres especiales, y funciona con o sin chasis de recinto.
¡Lo intenté con tu muestra csv y funciona como esperaba!
function csvstring_to_array($string, $separatorChar = '','', $enclosureChar = ''"'', $newlineChar = "/n") {
// @author: Klemen Nagode
$array = array();
$size = strlen($string);
$columnIndex = 0;
$rowIndex = 0;
$fieldValue="";
$isEnclosured = false;
for($i=0; $i<$size;$i++) {
$char = $string{$i};
$addChar = "";
if($isEnclosured) {
if($char==$enclosureChar) {
if($i+1<$size && $string{$i+1}==$enclosureChar){
// escaped char
$addChar=$char;
$i++; // dont check next char
}else{
$isEnclosured = false;
}
}else {
$addChar=$char;
}
}else {
if($char==$enclosureChar) {
$isEnclosured = true;
}else {
if($char==$separatorChar) {
$array[$rowIndex][$columnIndex] = $fieldValue;
$fieldValue="";
$columnIndex++;
}elseif($char==$newlineChar) {
echo $char;
$array[$rowIndex][$columnIndex] = $fieldValue;
$fieldValue="";
$columnIndex=0;
$rowIndex++;
}else {
$addChar=$char;
}
}
}
if($addChar!=""){
$fieldValue.=$addChar;
}
}
if($fieldValue) { // save last field
$array[$rowIndex][$columnIndex] = $fieldValue;
}
return $array;
}
Creo que la sintaxis str_getcsv () es mucho más limpia, y no requiere que el archivo CSV se almacene en el sistema de archivos.
$csv = str_getcsv(file_get_contents(''myCSVFile.csv''));
echo ''<pre>'';
print_r($csv);
echo ''</pre>'';
O para una solución línea por línea:
$csv = array();
$lines = file(''myCSVFile.csv'', FILE_IGNORE_NEW_LINES);
foreach ($lines as $key => $value)
{
$csv[$key] = str_getcsv($value);
}
echo ''<pre>'';
print_r($csv);
echo ''</pre>'';
O para una solución línea por línea sin str_getcsv ():
$csv = array();
$file = fopen(''myCSVFile.csv'', ''r'');
while (($result = fgetcsv($file)) !== false)
{
$csv[] = $result;
}
fclose($file);
echo ''<pre>'';
print_r($csv);
echo ''</pre>'';
Esta función devolverá una matriz con valores de encabezado como claves de matriz.
function csv_to_array($file_name) {
$data = $header = array();
$i = 0;
$file = fopen($file_name, ''r'');
while (($line = fgetcsv($file)) !== FALSE) {
if( $i==0 ) {
$header = $line;
} else {
$data[] = $line;
}
$i++;
}
fclose($file);
foreach ($data as $key => $_value) {
$new_item = array();
foreach ($_value as $key => $value) {
$new_item[ $header[$key] ] =$value;
}
$_data[] = $new_item;
}
return $_data;
}
Para obtener una matriz con las teclas correctas, puede intentar esto:
// Open file
$file = fopen($file_path, ''r'');
// Headers
$headers = fgetcsv($file);
// Rows
$data = [];
while (($row = fgetcsv($file)) !== false)
{
$item = [];
foreach ($row as $key => $value)
$item[$headers[$key]] = $value ?: null;
$data[] = $item;
}
// Close file
fclose($file);
Por favor, busque debajo de un enlace a la función de @knagode, mejorado con un parámetro de filas omitidas. https://gist.github.com/gabrieljenik/47fc38ae47d99868d5b3#file-csv_to_array
<?php
/**
* Convert a CSV string into an array.
*
* @param $string
* @param $separatorChar
* @param $enclosureChar
* @param $newlineChar
* @param $skip_rows
* @return array
*/
public static function csvstring_to_array($string, $skip_rows = 0, $separatorChar = '';'', $enclosureChar = ''"'', $newlineChar = "/n") {
// @author: Klemen Nagode
// @source: http://.com/questions/1269562/how-to-create-an-array-from-a-csv-file-using-php-and-the-fgetcsv-function
$array = array();
$size = strlen($string);
$columnIndex = 0;
$rowIndex = 0;
$fieldValue="";
$isEnclosured = false;
for($i=0; $i<$size;$i++) {
$char = $string{$i};
$addChar = "";
if($isEnclosured) {
if($char==$enclosureChar) {
if($i+1<$size && $string{$i+1}==$enclosureChar){
// escaped char
$addChar=$char;
$i++; // dont check next char
}else{
$isEnclosured = false;
}
}else {
$addChar=$char;
}
}else {
if($char==$enclosureChar) {
$isEnclosured = true;
}else {
if($char==$separatorChar) {
$array[$rowIndex][$columnIndex] = $fieldValue;
$fieldValue="";
$columnIndex++;
}elseif($char==$newlineChar) {
echo $char;
$array[$rowIndex][$columnIndex] = $fieldValue;
$fieldValue="";
$columnIndex=0;
$rowIndex++;
}else {
$addChar=$char;
}
}
}
if($addChar!=""){
$fieldValue.=$addChar;
}
}
if($fieldValue) { // save last field
$array[$rowIndex][$columnIndex] = $fieldValue;
}
/**
* Skip rows.
* Returning empty array if being told to skip all rows in the array.
*/
if ($skip_rows > 0) {
if (count($array) == $skip_rows)
$array = array();
elseif (count($array) > $skip_rows)
$array = array_slice($array, $skip_rows);
}
return $array;
}
Pregunta anterior, pero sigue siendo relevante para usuarios de PHP 5.2. str_getcsv está disponible desde PHP 5.3. He escrito una pequeña función que funciona con fgetcsv en sí.
Debajo está mi función de https://gist.github.com/4152628 :
function parse_csv_file($csvfile) {
$csv = Array();
$rowcount = 0;
if (($handle = fopen($csvfile, "r")) !== FALSE) {
$max_line_length = defined(''MAX_LINE_LENGTH'') ? MAX_LINE_LENGTH : 10000;
$header = fgetcsv($handle, $max_line_length);
$header_colcount = count($header);
while (($row = fgetcsv($handle, $max_line_length)) !== FALSE) {
$row_colcount = count($row);
if ($row_colcount == $header_colcount) {
$entry = array_combine($header, $row);
$csv[] = $entry;
}
else {
error_log("csvreader: Invalid number of columns at line " . ($rowcount + 2) . " (row " . ($rowcount + 1) . "). Expected=$header_colcount Got=$row_colcount");
return null;
}
$rowcount++;
}
//echo "Totally $rowcount rows found/n";
fclose($handle);
}
else {
error_log("csvreader: Could not read CSV /"$csvfile/"");
return null;
}
return $csv;
}
Devoluciones
Comience a leer CSV
Array
(
[0] => Array
(
[vid] =>
[agency] =>
[division] => Division
[country] =>
[station] => Duty Station
[unit] => Unit / Department
[grade] =>
[funding] => Fund Code
[number] => Country Office Position Number
[wnumber] => Wings Position Number
[title] => Position Title
[tor] => Tor Text
[tor_file] =>
[status] =>
[datetime] => Entry on Wings
[laction] =>
[supervisor] => Supervisor Index Number
[asupervisor] => Alternative Supervisor Index
[author] =>
[category] =>
[parent] => Reporting to Which Position Number
[vacant] => Status (Vacant / Filled)
[index] => Index Number
)
[1] => Array
(
[vid] =>
[agency] => WFP
[division] => KEN Kenya, The Republic Of
[country] =>
[station] => Nairobi
[unit] => Human Resources Officer P4
[grade] => P-4
[funding] => 5000001
[number] => 22018154
[wnumber] =>
[title] => Human Resources Officer P4
[tor] =>
[tor_file] =>
[status] =>
[datetime] =>
[laction] =>
[supervisor] =>
[asupervisor] =>
[author] =>
[category] => Professional
[parent] =>
[vacant] =>
[index] => xxxxx
)
)
Prueba este código:
function readCsv($file)
{
if (($handle = fopen($file, ''r'')) !== FALSE) {
while (($lineArray = fgetcsv($handle, 4000)) !== FALSE) {
print_r(lineArray);
}
fclose($handle);
}
}
Prueba esto..
function getdata($csvFile){
$file_handle = fopen($csvFile, ''r'');
while (!feof($file_handle) ) {
$line_of_text[] = fgetcsv($file_handle, 1024);
}
fclose($file_handle);
return $line_of_text;
}
// Set path to CSV file
$csvFile = ''test.csv'';
$csv = getdata($csvFile);
echo ''<pre>'';
print_r($csv);
echo ''</pre>'';
Array
(
[0] => Array
(
[0] => Project
[1] => Date
[2] => User
[3] => Activity
[4] => Issue
[5] => Comment
[6] => Hours
)
[1] => Array
(
[0] => test
[1] => 04/30/2015
[2] => test
[3] => test
[4] => test
[5] =>
[6] => 6.00
));
Se me ocurrió este código bastante básico. Creo que podría ser útil para cualquiera.
$link = "link to the CSV here"
$fp = fopen($link, ''r'');
while(($line = fgetcsv($fp)) !== FALSE) {
foreach($line as $key => $value) {
echo $key . " - " . $value . "<br>";
}
}
fclose($fp);
$arrayFromCSV = array_map(''str_getcsv'', file(''/path/to/file.csv''));