Мне нужно прочитать данные из файла, который может быть разделен запятой или табуляцией. Теперь я вижу, что есть функция getcsv, но она принимает только один возможный разделитель.
Любые идеи, как справиться с этим?
Спасибо.
Мне нужно прочитать данные из файла, который может быть разделен запятой или табуляцией. Теперь я вижу, что есть функция getcsv, но она принимает только один возможный разделитель.
Любые идеи, как справиться с этим?
Спасибо.
Начиная с PHP 5.3, вы можете использовать str_getcsv() для чтения отдельных строк с использованием разных разделителей.
$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);
Вы можете указать разделитель для fgetcsv(). Это пример чтения файлов с разделителями табуляции,
while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) {
...
}
Вот пример, который будет читать mydata.txt
поля 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);
Прочитайте весь файл или по очереди и разделите его с помощью split.
Там вы можете включить регулярное выражение с произвольными разделителями. У меня нет PHP здесь, чтобы протестировать инструкцию, но php.net → искать split(). Там также есть комментарий, связанный с регулярным выражением.
вы можете попробовать explode
explode ( string $delimiter , string $string [, int $limit ] );
Вот функция, которую я добавил в свою утилиту для будущего использования. Я получил его из ответа NSSec.
Это решение позволяет указать, хотите ли вы использовать первую строку в качестве ключей для массива. Я, вероятно, добавлю возможность передать массив, который будет использоваться для ключей для параметра $first_line_keys в какой-то момент.
/**
* 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()
$filePath = "somefile.txt";
$delimiter = "\t";
$file = new \SplFileObject($filePath);
while (!$file->eof()) {
$line = $file->fgetcsv($delimiter);
print_r($line);
}