Php fputcsv windows 1251

fputcsv — Форматирует строку в виде CSV и записывает её в файловый указатель

(PHP 5 >= 5.1.0, PHP 7)

fputcsv — Форматирует строку в виде CSV и записывает её в файловый указатель

Описание

fputcsv() форматирует строку (переданную в виде массива fields ) в виде CSV и записывает её (заканчивая переводом строки) в указанный файл handle .

Список параметров

Указатель на файл должен быть корректным и указывать на файл, успешно открытый функциями fopen() или fsockopen() (и все еще не закрытым функцией fclose() ).

Дополнительный параметр delimiter устанавливает разделитель полей (только один символ).

Дополнительный параметр enclosure устанавливает ограничитель полей (только один символ).

Необязательный параметр escape_char задает экранирующий символ (только один символ).

Возвращаемые значения

Возвращает длину записанной строки или FALSE в случае возникновения ошибки.

Список изменений

Версия Описание
5.5.4 Добавлен параметр escape_char

Примеры

Пример #1 Пример использования fputcsv()

= array (
array( ‘aaa’ , ‘bbb’ , ‘ccc’ , ‘dddd’ ),
array( ‘123’ , ‘456’ , ‘789’ ),
array( ‘»aaa»‘ , ‘»bbb»‘ )
);

$fp = fopen ( ‘file.csv’ , ‘w’ );

foreach ( $list as $fields ) <
fputcsv ( $fp , $fields );
>

Вышеуказанный пример запишет в файл file.csv следующее:

Примечания

Замечание: Если у вас возникают проблемы с распознаванием PHP концов строк при чтении или создании файлов на Macintosh-совместимом компьютере, включение опции auto_detect_line_endings может помочь решить проблему.

Смотрите также

  • fgetcsv() — Читает строку из файла и производит разбор данных CSV

CSV файлы на PHP — создание и чтение

CSV очень удобный формат с точки зрения генерации, поскольку он очень просто устроен. В этой заметке разберемся как устроены файлы с расширением .csv , как их создавать и разбирать (парсить) в PHP. Делается это очень просто.

Ниже приведены простые PHP функции для создания и парсинга csv файлов. Никаких библиотек — для CSV это лишнее!

Чтобы понимать суть вещей, нужно разобраться в спецификации CSV файлов, как устроен формат. Давайте коротко.

CSV (Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных.

Каждая строка файла — это одна строка таблицы.

Разделителем значений колонок является символ: , (запятая). Для русского языка используется ; (точка с запятой), потому что в русском запятая используется в дробных числах.

Значения, содержащие зарезервированные символы: » , ; \r\n или \n или \r (двойная кавычка, запятая, точка с запятой, новая строка) обрамляются двойными кавычками » .

Если в значении встречаются двойные кавычки » , то они должны выглядеть как двое кавычек подряд «» .

  • Строка файла может разделяться символами: \r\n или \n .
  • Это все что нужно знать, чтобы работать с CSV!

    Пример для рус. языка:

    Пример для англ. языка:

    Wiki-справка

    Большинство программ под CSV понимают более общий формат DSV (delimiter-separated values — значения разделённые разделителем), допускающий использование иных символов в качестве разделителя. В частности, в русской и других локалях запятая по умолчанию зарезервирована под десятичный разделитель. Поэтому как разделитель используется точка с запятой или табуляция (формат TSV).

    Сегодня под CSV понимают набор значений, разделенных какими угодно разделителями, в какой угодно кодировке с какими угодно окончаниями строк. Это значительно затрудняет перенос данных из одних программ в другие, несмотря на всю простоту формата.

    Создание CSV файла в PHP

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

    Важным моментом, является кодировка файла. Для корректного отображения кириллицы следует использовать кодировку cp1251 (windows-1251).

    Разделитель колонок

    Для русского языка символом-разделителем является ; (точка с запятой). Для англ. , (запятая).

    Строки содержащие спец символы: » , ; \r\n или \n или \r должны быть в двойных кавычках «строка» .

    Двойные кавычки внутри строки, нужно «очистить» поставив перед кавычкой еще одну такую же кавычку: строка «csv» превратиться в «строка «»csv»»» . Обрамление в кавычки нужно, чтобы можно было внутри значений колонок использовать разделители ; , , и не переживать что что-то сломается при чтении файла.

    Разделитель строк

    Для разделения строк в csv файлах можно использовать \r\n (возврат каретки и перенос строки, CR LF). В этом случае, если нужен перенос строки внутри значения колонки, то там используется просто \n .

    Также, для разделения строки, может использоваться просто \n (перенос строки, LF). В этом случае, перенос строки внутри значения колонки должен обозначаться как \r (возврат каретки CR).

    Функция для создания CSV файла

    меню

    Чтение CSV файла в PHP

    Когда нужно получить данные из CSV файла, т.е. разобрать его и получить данные в переменную, можно использовать встороенную в PHP функцию str_getcsv() .

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

    Вариант на базе функции str_getcsv() :

    Конвертация .lsx , .xlsx файла в .csv

    Чтобы перевести Excel файл в CSV, нужно открыть его в Excel и сохранить в формате .csv :

    Если такую конвертацию нужно сделать программно, смотрите в сторону онлайн конвертеров с API или готовых библиотек.

    Сталкивались с такой задачей и знаете более универсальный способ? Прошу поделиться в комментариях.

    Я столкнулся и потратил несколько часов перебирая всякий не универсальный «мусор» из гугла — то одно не работает, то другое, то библиотеку нужно ставить «хитро-мудрую». Так и появилась эта заметка.

    Тема, конечно, интересная. Только этот код в реальных условиях работать не будет.

    Что с ним не так?

    1) Разделитель поля может быть любой. Например, ‘\’, ‘|’ или ещё что похуже.
    2) Символ ограничителя поля может быть как двойная, так и одинарная ковычка.
    3) Неплохо бы использовать unset в коде. Память на сервере всё-таки не резиновая. Одно дело загрузка файла с пару сотен строк кода, а другое если их пару десятков миллионов.

    1) Ты параметр $col_delimiter не увидел похоже, суй туда какой угодно разделитель!

    2) Для текущего кода (обоих) это учитывается: в первом создается строка с двойной кавычкой и только. Во втором строка парсится PHP функцией str_getcsv() которая обе кавычки понимает.

    3) В каком месте там unset по твоему поможет хорошо избавится от потерь памяти? Если у тебя файл выходит за пределы памяти, что редкость с текущими параметрами серверов, то это пожалуй экстра случай и подход уже нужен будет принципиально другой. Файл читать или записывать нужно будет частями или построчно, а не так целиком. По аналогии ты в ВП запихай 50 000 рубрик и все приехали, нужно будет костыли вставлять для нормальной работы. Но ВП почему-то самая популярная CMS, как же так? Я не писал код на все случаи жизни, код покрывает 80% случаев, остальное уже требует отдельного подхода, а этот код можно взять за основу.

    Этот код в реальных условиях у меня работает! Может там и есть баги, но я их не встречал.

    П.С. просмотрел второй код, добавил unset() маловероятно что много толку от этого, но лишним не будет.

    Не «суй туда какой угодно разделитель», а все возможные разделители для csv файлов. Ты бы ещё менеджеру предложил указывать разделитель для файла, который он загружает

    «с текущими параметрами серверов». Поверь, кривым кодом можно положить сервер даже с очень хорошими характеристиками. Я обычно беру за правило, если переменная больше не будет использоваться она должна умереть (или обнулиться). Когда поработаешь с хайлоудом, то начинаешь понимать цену памяти)

    И вообще, если пишешь рабочую программу, нужно это делать хорошо, а не в стиле «мой первый скрипт»!

    Демогогия это, ты реальную проблему покажи, так я её не вижу.

    П.С. я люблю стиль «мой первый скрипт». Этот сайт как раз в таком стиле написан, пока все устраивает

    Важным моментом, является кодировка файла. Для корректного отображения кириллицы следует использовать кодировку cp1251 (windows-1251).

    fputcsv

    (PHP 5 >= 5.1.0, PHP 7, PHP 8)

    fputcsv — Форматирует строку в виде CSV и записывает её в файловый указатель

    Описание

    fputcsv() форматирует строку (переданную в виде массива fields ) в виде CSV и записывает её (заканчивая переводом строки) в указанный файл handle .

    Список параметров

    Указатель на файл должен быть корректным и указывать на файл, успешно открытый функциями fopen() или fsockopen() (и всё ещё не закрытый функцией fclose() ).

    Массив строк ( string ).

    Дополнительный параметр delimiter устанавливает разделитель полей (только один символ).

    Дополнительный параметр enclosure устанавливает ограничитель полей (только один символ).

    Необязательный параметр escape_char задаёт экранирующий символ (максимум один символ). Пустая строка ( «» ) отключает проприетарный механизм экранирования.

    Если символ enclosure содержится в поле, он будет экранирован путём его удвоения, если ему не предшествует escape_char .

    Возвращаемые значения

    Возвращает длину записанной строки или false в случае возникновения ошибки.

    Список изменений

    Версия Описание
    7.4.0 Теперь параметр escape_char может принимать пустую строку для отключения проприетарного механизма экранирования.
    5.5.4 Добавлен параметр escape_char

    Примеры

    Пример #1 Пример использования fputcsv()

    = array (
    array( ‘aaa’ , ‘bbb’ , ‘ccc’ , ‘dddd’ ),
    array( ‘123’ , ‘456’ , ‘789’ ),
    array( ‘»aaa»‘ , ‘»bbb»‘ )
    );

    $fp = fopen ( ‘file.csv’ , ‘w’ );

    foreach ( $list as $fields ) <
    fputcsv ( $fp , $fields );
    >

    Вышеуказанный пример запишет в файл file.csv следующее:

    Примечания

    Замечание: Если у вас возникают проблемы с распознаванием PHP концов строк при чтении или создании файлов на Macintosh-совместимом компьютере, включение опции auto_detect_line_endings может помочь решить проблему.

    Смотрите также

    • fgetcsv() — Читает строку из файла и производит разбор данных CSV

    User Contributed Notes 26 notes

    If you need to send a CSV file directly to the browser, without writing in an external file, you can open the output and use fputcsv on it..

    = fopen ( ‘php://output’ , ‘w’ );
    fputcsv ( $out , array( ‘this’ , ‘is some’ , ‘csv «stuff», you know.’ ));
    fclose ( $out );
    ?>

    If you need to save the output to a variable (e.g. for use within a framework) you can write to a temporary memory-wrapper and retrieve it’s contents:

    // output up to 5MB is kept in memory, if it becomes bigger it will automatically be written to a temporary file
    $csv = fopen ( ‘php://temp/maxmemory:’ . ( 5 * 1024 * 1024 ), ‘r+’ );

    fputcsv ( $csv , array( ‘blah’ , ‘blah’ ));

    // put it all in a variable
    $output = stream_get_contents ( $csv );
    ?>

    Sometimes it’s useful to get CSV line as string. I.e. to store it somewhere, not in on a filesystem.

    function csvstr (array $fields ) : string
    <
    $f = fopen ( ‘php://memory’ , ‘r+’ );
    if ( fputcsv ( $f , $fields ) === false ) <
    return false ;
    >
    rewind ( $f );
    $csv_line = stream_get_contents ( $f );
    return rtrim ( $csv_line );
    >
    ?>

    if you want make UTF-8 file for excel, use this:

    $fp = fopen($filename, ‘w’);
    //add BOM to fix UTF-8 in Excel
    fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));

    Please note, that fputcsv ist not always enclosing strings with the enclosure character.

    = fopen ( ‘file.csv’ , ‘w’ );

    $a = [ ‘One 1’ , ‘Two’ , ‘Three 3’ ];

    fputcsv ( $fh , $a , «\t» );

    fclose ( $fh );
    ?>

    results in a file containing the line:
    «One 1» Two «Three 3»

    It seems that only strings containing at least one of the following characters are enclosed:

    — the delimiter character
    — the enclosure character
    — the escape character
    — \n (new line)
    — \r (line feed)
    — \t (tab)
    — blank

    I hope this saves you the hour it took me to get to the bottom of this behaviour.

    Using fputcsv to output a CSV with a tab delimiter is a little tricky since the delimiter field only takes one character.
    The answer is to use the chr() function. The ascii code for tab is 9, so chr(9) returns a tab character.

    ( $fp , $foo , ‘\t’ ); //won’t work
    fputcsv ( $fp , $foo , ‘ ‘ ); //won’t work

    it should be:
    ( $fp , $foo , «\t» );
    ?>
    you just forgot that single quotes are literal. meaning whatever you put there that’s what will come out so ‘\t’ would be same as ‘t’ because \ in that case would be only used for escaping but if you use double quotes then that would work.

    the solution for how to solve the encoding problem while converting an array to csv file is below.

    $fp = fopen(‘php://memory’, ‘w’);
    //add BOM to fix UTF-8 in Excel
    fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
    // output the column headings
    //fputcsv($fp, array(‘Topic’, ‘Title’, ‘URL’, ‘Keywords’, ‘Score’, ‘FB_count’, ‘TW_count’, ‘|’));
    if(isset($trend)) <
    foreach ( $trend as $myField ) <
    fputcsv($fp, $myField, ‘|’);
    >
    >

    Utility function to output a mysql query to csv with the option to write to file or send back to the browser as a csv attachment.

    function query_to_csv ( $db_conn , $query , $filename , $attachment = false , $headers = true ) <

    if( $attachment ) <
    // send response headers to the browser
    header ( ‘Content-Type: text/csv’ );
    header ( ‘Content-Disposition: attachment;filename=’ . $filename );
    $fp = fopen ( ‘php://output’ , ‘w’ );
    > else <
    $fp = fopen ( $filename , ‘w’ );
    >

    $result = mysql_query ( $query , $db_conn ) or die( mysql_error ( $db_conn ) );

    if( $headers ) <
    // output header row (if at least one row exists)
    $row = mysql_fetch_assoc ( $result );
    if( $row ) <
    fputcsv ( $fp , array_keys ( $row ));
    // reset pointer back to beginning
    mysql_data_seek ( $result , 0 );
    >
    >

    while( $row = mysql_fetch_assoc ( $result )) <
    fputcsv ( $fp , $row );
    >

    // Using the function
    $sql = «SELECT * FROM table» ;
    // $db_conn should be a valid db handle

    // output as an attachment
    query_to_csv ( $db_conn , $sql , «test.csv» , true );

    // output to file system
    query_to_csv ( $db_conn , $sql , «test.csv» , false );
    ?>

    I’ve created a function for quickly generating CSV files that work with Microsoft applications. In the field I learned a few things about generating CSVs that are not always obvious. First, since PHP is generally *nix-based, it makes sense that the line endings are always \n instead of \r\n. However, certain Microsoft programs (I’m looking at you, Access 97), will fail to recognize the CSV properly unless each line ends with \r\n. So this function changes the line endings accordingly. Secondly, if the first column heading / value of the CSV file begins with uppercase ID, certain Microsoft programs (ahem, Excel 2007) will interpret the file as being in the SYLK format rather than CSV, as described here: http://support.microsoft.com/kb/323626

    This function accommodates for that as well, by forcibly enclosing that first value in quotes (when this doesn’t occur automatically). It would be fairly simple to modify this function to use another delimiter if need be and I leave that as an exercise to the reader. So quite simply, this function is used for outputting CSV data to a CSV file in a way that is safe for use with Windows applications. It takes two parameters + one optional parameter: the location of where the file should be saved, an array of data rows, and an optional array of column headings. (Technically you could omit the headings array and just include it as the first row of the data, but it is often useful to keep this data stored in different arrays in practice.)

    function mssafe_csv ( $filepath , $data , $header = array())
    <
    if ( $fp = fopen ( $filepath , ‘w’ ) ) <
    $show_header = true ;
    if ( empty( $header ) ) <
    $show_header = false ;
    reset ( $data );
    $line = current ( $data );
    if ( !empty( $line ) ) <
    reset ( $line );
    $first = current ( $line );
    if ( substr ( $first , 0 , 2 ) == ‘ID’ && ! preg_match ( ‘/[«\\s,]/’ , $first ) ) <
    array_shift ( $data );
    array_shift ( $line );
    if ( empty( $line ) ) <
    fwrite ( $fp , «\» < $first >\»\r\n» );
    > else <
    fwrite ( $fp , «\» < $first >\»,» );
    fputcsv ( $fp , $line );
    fseek ( $fp , — 1 , SEEK_CUR );
    fwrite ( $fp , «\r\n» );
    >
    >
    >
    > else <
    reset ( $header );
    $first = current ( $header );
    if ( substr ( $first , 0 , 2 ) == ‘ID’ && ! preg_match ( ‘/[«\\s,]/’ , $first ) ) <
    array_shift ( $header );
    if ( empty( $header ) ) <
    $show_header = false ;
    fwrite ( $fp , «\» < $first >\»\r\n» );
    > else <
    fwrite ( $fp , «\» < $first >\»,» );
    >
    >
    >
    if ( $show_header ) <
    fputcsv ( $fp , $header );
    fseek ( $fp , — 1 , SEEK_CUR );
    fwrite ( $fp , «\r\n» );
    >
    foreach ( $data as $line ) <
    fputcsv ( $fp , $line );
    fseek ( $fp , — 1 , SEEK_CUR );
    fwrite ( $fp , «\r\n» );
    >
    fclose ( $fp );
    > else <
    return false ;
    >
    return true ;
    >

    Alright, after playing a while, I’m confident the following replacement function works in all cases, including the ones for which the native fputcsv function fails. If fputcsv fails to work for you (particularly with mysql csv imports), try this function as a drop-in replacement instead.

    Arguments to pass in are exactly the same as for fputcsv, though I have added an additional $mysql_null boolean which allows one to turn php null’s into mysql-insertable nulls (by default, this add-on is disabled, thus working identically to fputcsv [except this one works!]).

    function fputcsv2 ( $fh , array $fields , $delimiter = ‘,’ , $enclosure = ‘»‘ , $mysql_null = false ) <
    $delimiter_esc = preg_quote ( $delimiter , ‘/’ );
    $enclosure_esc = preg_quote ( $enclosure , ‘/’ );

    $output [] = preg_match ( «/(?: $ < delimiter_esc >| $ < enclosure_esc >|\s)/» , $field ) ? (
    $enclosure . str_replace ( $enclosure , $enclosure . $enclosure , $field ) . $enclosure
    ) : $field ;
    >

    fwrite ( $fh , join ( $delimiter , $output ) . «\n» );
    >

    Читайте также:  Mac os для ноутбук lenovo
    Оцените статью