Подтвердить что ты не робот

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

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

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

Спасибо.

4b9b3361

Ответ 1

Начиная с 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);

Ответ 2

Вы можете указать разделитель для fgetcsv(). Это пример чтения файлов с разделителями табуляции,

 while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) {
    ...
 }

Ответ 3

Вот пример, который будет читать 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);

Ответ 4

Прочитайте весь файл или по очереди и разделите его с помощью split.

Там вы можете включить регулярное выражение с произвольными разделителями. У меня нет PHP здесь, чтобы протестировать инструкцию, но php.net → искать split(). Там также есть комментарий, связанный с регулярным выражением.

Ответ 5

вы можете попробовать explode

explode ( string $delimiter , string $string [, int $limit ] );

Ответ 6

Вот функция, которую я добавил в свою утилиту для будущего использования. Я получил его из ответа 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()

Ответ 7

$filePath = "somefile.txt";
$delimiter = "\t";

$file = new \SplFileObject($filePath);
while (!$file->eof()) {
    $line = $file->fgetcsv($delimiter);
    print_r($line);
}