Не удается преобразовать массив и отобразить в формате csv

#php #arrays #csv #spreadsheet

#php #массивы #csv #электронная таблица

Вопрос:

Я пытаюсь прочитать текстовый файл, преобразовать его в csv и отобразить в электронной таблице. Здесь много примеров, и я перепробовал многие из них, но результат тот же. Кажется, у меня две проблемы. Во-первых, код, который я использую для преобразования строки csv, добавляет дополнительную запятую в конец, и я не могу ее удалить. Во-вторых, даже при вводе тестовой строки электронная таблица не открывается.

Когда я читаю в своем тестовом файле, я получаю такой массив:

     array [
    Hunky Bill's Big Perogie / Pierogi Maker
    9
    4
    10
    5
    5
    1
    2
    1
    ]
 

Код, который я использую

     $csv_file = 'arry.txt';
    $save_name = 'csvout.csv';

    if (($fp = fopen($csv_file ,'r'))) {  
       while(! feof($fp)) { 
          $item = fgets($fp);
          $item = rtrim($item, "rn");
          $csv_string .= '"' . $item . '",';
         
         // $csv_string = substr($csv_string, 0, -1);  
         // $csv_string[strlen($csv_string)] = '';
         // $csv_string = rtrim($csv_string, ',');
       }      
       fclose($fp);  
    }  

    header("Expires: Mon, 26 Nov 2162 00:00:00 GMT");
    header("Last-Modified: " . gmdate('D,d M Y H:i:s') . ' GMT');
    header("Cache-Control: no-cache, must-revalidate");
    header("Pragma: no-cache");
    header("Content-Type: Application/octet-stream");
    header("Content-Disposition: attachment; filename=$save_name");
          
    echo $csv_string;
 

Выполнение приведенного выше отображает это на экране:

     "Hunky Bills Big Perogie  Pierogi Maker","9","4","10","5","5","1","2","1","","",
 

Если я раскомментирую любую из трех строк, предназначенных для удаления этой последней запятой, все запятые будут удалены. Почему это?

Если я пропущу вышесказанное и просто введу эту строку перед оператором echo, электронная таблица все равно не откроется. Должен ли он открываться в программе электронных таблиц?

     $csv_string = '"Hunky Bills Big Perogie  Pierogi Maker","9","4","10","5","5","1","2","1"';   
 

Кто-нибудь может увидеть, в чем мои проблемы?

Ответ №1:

Используемый вами цикл while добавляет запятую после каждого элемента. «Три строки, предназначенные для удаления последней запятой», расположены внутри цикла while. Чтобы решить эту проблему, попробуйте реорганизовать свой код следующим образом, с удалением последней запятой после завершения цикла while:

 if (($fp = fopen($csv_file ,'r'))) {  
    while(! feof($fp)) { 
        $item = fgets($fp);
        $item = rtrim($item, "rn");
        $csv_string .= '"' . $item . '",';
    }
    $csv_string = substr($csv_string, 0, -1);  
    fclose($fp);
}
 

Далее, echo $csv_string в конце кода дается указание программе вывести строку на экран, так что это то, что вы видите. Возможно, вы захотите сохранить $csv_string в текстовый файл с расширением .csv, а затем попытаться открыть его с помощью программы для работы с электронными таблицами.

Комментарии:

1. Спасибо за исправление запятой. Но я, возможно, не совсем понимаю вторую проблему. Когда страница загружается, я хочу, чтобы текстовый файл был удален, а затем он был открыт в файле электронной таблицы. Разве это не цель операторов заголовка?

Ответ №2:

Во-первых, при отладке такого рода цитат пропустите все header материалы и Excel, пока они вам действительно не понадобятся. Это намного проще для отладки с необработанным текстом.

Во-вторых, вместо echo того, чтобы проверить var_dump , он показывает содержимое переменных более понятным способом.

Я рекомендую сохранить содержимое в массиве и разделить его запятой в конце, подробнее см. Комментарии.

 // We'll store items here temporarily
$csv_items = [];

if (($fp = fopen($csv_file, 'r'))) {
    while (!feof($fp)) {

        $item = fgets($fp);

        // Sanity check that we received something
        if (false === $item) {
            break;
        }

        // Trim both sides (unless you have a need for whitespace)
        $item = trim($item);

        // If we still have more than just an empty string
        if ($item) {
            // Append, optionally with quotes
            $csv_items[] = '"'.$item.'"';
        }
    }
    fclose($fp);
}

// Create final string
$csv_string = implode(',', $csv_items);

var_dump($csv_string);
 

Демонстрация здесь: https://3v4l.org/Chk2M

Кроме того, если ваши данные могут содержать кавычки, вам, возможно, придется иметь дело и с этим. Я лично использую для этого библиотеку, которая часто бывает излишней, но тогда мне не нужно беспокоиться об этом. Вы также можете написать CSV, используя fputcsv и другие.

Комментарии:

1. На случай, если у кого-нибудь возникнет моя вторая проблема, оказалось, что файл включается в начало файла, перед командами заголовка. В этом файле содержится html-код. Я переместил его дальше по странице, и теперь электронная таблица открывается при загрузке.