Чтение текстового файла с запятой или табуляцией

Мне нужно прочитать данные из файла, который может быть разделен запятой или табуляцией. Теперь я вижу, что есть функция getcsv, но она принимает только один возможный разделитель.

Любые идеи, как справиться с этим?

Благодарю.

Solutions Collecting From Web of "Чтение текстового файла с запятой или табуляцией"

Начиная с 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 mydata.txt

 $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 ( 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); }