php - separado - Lectura de coma o archivo de texto delimitado por tabulaciones
macro para exportar datos de excel a txt (7)
A partir de PHP 5.3, puede usar str_getcsv() para leer líneas individuales usando diferentes delimitadores.
$someCondition = someConditionToDetermineTabOrComma();
$delimiter = $someCondition ? "," : "/t";
$fp = fopen(''mydata.csv'', ''r'');
while ( !feof($fp) )
{
$line = fgets($fp, 2048);
$data = str_getcsv($line, $delimiter);
doSomethingWithData($data);
}
fclose($fp);
Necesito leer los datos de un archivo que puede estar delimitado por comas o tabulaciones. Ahora que hay una función getcsv pero acepta solo un posible delimitador.
¿Alguna idea de cómo manejar esto?
Gracias.
Aquí está la función que agregué a mi biblioteca de utilidades para uso futuro. Derivé de la respuesta de NSSec .
Esta solución le permite especificar si desea usar la primera línea como claves para la matriz. Probablemente agregaré la capacidad de pasar una matriz que se usará para las claves del parámetro $ first_line_keys en algún momento.
/**
* Converts a CSV file into an array
* NOTE: file does NOT have to have .csv extension
*
* $file - path to file to convert (string)
* $delimiter - field delimiter (string)
* $first_line_keys - use first line as array keys (bool)
* $line_lenght - set length to retrieve for each line (int)
*/
public static function CSVToArray($file, $delimiter = '','', $first_line_keys = true, $line_length = 2048){
// file doesn''t exist
if( !file_exists($file) ){
return false;
}
// open file
$fp = fopen($file, ''r'');
// add each line to array
$csv_array = array();
while( !feof($fp) ){
// get current line
$line = fgets($fp, $line_length);
// line to array
$data = str_getcsv($line, $delimiter);
// keys/data count mismatch
if( isset($keys) && count($keys) != count($data) ){
// skip to next line
continue;
// first line, first line should be keys
}else if( $first_line_keys && !isset($keys) ){
// use line data for keys
$keys = $data;
// first line used as keys
}else if($first_line_keys){
// add as associative array
$csv_array[] = array_combine($keys, $data);
// first line NOT used for keys
}else{
// add as numeric array
$csv_array[] = $data;
}
}
// close file
fclose($fp);
// nothing found
if(!$csv_array){
return array();
}
// return csv array
return $csv_array;
} // CSVToArray()
Aquí hay un ejemplo que leerá mydata.txt
campos CSV
$tab = "/t";
$fp = fopen(''mydata.txt'', ''r'');
while ( !feof($fp) )
{
$line = fgets($fp, 2048);
$data_txt = str_getcsv($line, $tab);
//Get First Line of Data over here
print_r($data_txt);
exit;
}
fclose($fp);
Lea el archivo completo, o línea por línea y divídalo usando división.
Allí puede incluir una expresión regular con delimitadores arbitrarios. No tengo PHP aquí para probar una declaración, pero php.net -> buscar por split (). Ahí también tienes un comentario relacionado con expresiones regulares.
Puede especificar un delimitador para fgetcsv (). Este es un ejemplo de lectura de archivos delimitados por tabuladores,
while (($data = fgetcsv($handle, 1000, "/t")) !== FALSE) {
...
}
puedes intentar explode
explode ( string $delimiter , string $string [, int $limit ] );
$filePath = "somefile.txt";
$delimiter = "/t";
$file = new /SplFileObject($filePath);
while (!$file->eof()) {
$line = $file->fgetcsv($delimiter);
print_r($line);
}