正文
有时候会碰到用户上传csv文件,php读取文件内容的需求,php也有相应的处理函数。
fgetcsv — 从文件指针中读入一行并解析 CSV 字段
fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = ',' [, string $enclosure = '"' [, string $escape = '\\' ]]]] ) : array
看一个示例:
$filename = '/tmp/178776443';
$lists = [];
$handle = fopen($filename, 'r');
while (($data = fgetcsv($handle, 0, ",")) !== FALSE)
{
foreach ($data as $k => & $v)
{
$v = mb_convert_encoding($v, 'UTF-8', 'GBK');
}
$lists = $data;
}
fclose($handle);
函数原型
php标准库:
/**
* Opens file or URL
* @link https://php.net/manual/en/function.fopen.php
* @param string $filename <p>
* If filename is of the form "scheme://...", it
* is assumed to be a URL and PHP will search for a protocol handler
* (also known as a wrapper) for that scheme. If no wrappers for that
* protocol are registered, PHP will emit a notice to help you track
* potential problems in your script and then continue as though
* filename specifies a regular file.
* </p>
* <p>
* If PHP has decided that filename specifies
* a local file, then it will try to open a stream on that file.
* The file must be accessible to PHP, so you need to ensure that
* the file access permissions allow this access.
* If you have enabled &safemode;,
* or open_basedir further
* restrictions may apply.
* </p>
* <p>
* If PHP has decided that filename specifies
* a registered protocol, and that protocol is registered as a
* network URL, PHP will check to make sure that
* allow_url_fopen is
* enabled. If it is switched off, PHP will emit a warning and
* the fopen call will fail.
* </p>
* <p>
* The list of supported protocols can be found in . Some protocols (also referred to as
* wrappers) support context
* and/or &php.ini; options. Refer to the specific page for the
* protocol in use for a list of options which can be set. (e.g.
* &php.ini; value user_agent used by the
* http wrapper).
* </p>
* <p>
* On the Windows platform, be careful to escape any backslashes
* used in the path to the file, or use forward slashes.
* </p>
* <pre>
* <?php
* $handle = fopen("c:\\folder\\resource.txt", "r");
* ?>
* </pre>
* @param string $mode <p>
* The mode parameter specifies the type of access
* you require to the stream. It may be any of the following:
* <table>
* A list of possible modes for fopen
* using mode
* <tr valign="top">
* <td>mode</td>
* <td>Description</td>
* </tr>
* <tr valign="top">
* <td>'r'</td>
* <td>
* Open for reading only; place the file pointer at the
* beginning of the file.
* </td>
* </tr>
* <tr valign="top">
* <td>'r+'</td>
* <td>
* Open for reading and writing; place the file pointer at
* the beginning of the file.
* </td>
* </tr>
* <tr valign="top">
* <td>'w'</td>
* <td>
* Open for writing only; place the file pointer at the
* beginning of the file and truncate the file to zero length.
* If the file does not exist, attempt to create it.
* </td>
* </tr>
* <tr valign="top">
* <td>'w+'</td>
* <td>
* Open for reading and writing; place the file pointer at
* the beginning of the file and truncate the file to zero
* length. If the file does not exist, attempt to create it.
* </td>
* </tr>
* <tr valign="top">
* <td>'a'</td>
* <td>
* Open for writing only; place the file pointer at the end of
* the file. If the file does not exist, attempt to create it.
* </td>
* </tr>
* <tr valign="top">
* <td>'a+'</td>
* <td>
* Open for reading and writing; place the file pointer at
* the end of the file. If the file does not exist, attempt to
* create it.
* </td>
* </tr>
* <tr valign="top">
* <td>'x'</td>
* <td>
* Create and open for writing only; place the file pointer at the
* beginning of the file. If the file already exists, the
* fopen call will fail by returning false and
* generating an error of level E_WARNING. If
* the file does not exist, attempt to create it. This is equivalent
* to specifying O_EXCL|O_CREAT flags for the
* underlying open(2) system call.
* </td>
* </tr>
* <tr valign="top">
* <td>'x+'</td>
* <td>
* Create and open for reading and writing; place the file pointer at
* the beginning of the file. If the file already exists, the
* fopen call will fail by returning false and
* generating an error of level E_WARNING. If
* the file does not exist, attempt to create it. This is equivalent
* to specifying O_EXCL|O_CREAT flags for the
* underlying open(2) system call.
* </td>
* </tr>
* </table>
* </p>
* <p>
* Different operating system families have different line-ending
* conventions. When you write a text file and want to insert a line
* break, you need to use the correct line-ending character(s) for your
* operating system. Unix based systems use \n as the
* line ending character, Windows based systems use \r\n
* as the line ending characters and Macintosh based systems use
* \r as the line ending character.
* </p>
* <p>
* If you use the wrong line ending characters when writing your files, you
* might find that other applications that open those files will "look
* funny".
* </p>
* <p>
* Windows offers a text-mode translation flag ('t')
* which will transparently translate \n to
* \r\n when working with the file. In contrast, you
* can also use 'b' to force binary mode, which will not
* translate your data. To use these flags, specify either
* 'b' or 't' as the last character
* of the mode parameter.
* </p>
* <p>
* The default translation mode depends on the SAPI and version of PHP that
* you are using, so you are encouraged to always specify the appropriate
* flag for portability reasons. You should use the 't'
* mode if you are working with plain-text files and you use
* \n to delimit your line endings in your script, but
* expect your files to be readable with applications such as notepad. You
* should use the 'b' in all other cases.
* </p>
* <p>
* If you do not specify the 'b' flag when working with binary files, you
* may experience strange problems with your data, including broken image
* files and strange problems with \r\n characters.
* </p>
* <p>
* For portability, it is strongly recommended that you always
* use the 'b' flag when opening files with fopen.
* </p>
* <p>
* Again, for portability, it is also strongly recommended that
* you re-write code that uses or relies upon the 't'
* mode so that it uses the correct line endings and
* 'b' mode instead.
* </p>
* @param bool $use_include_path [optional] <p>
* The optional third use_include_path parameter
* can be set to '1' or true if you want to search for the file in the
* include_path, too.
* </p>
* @param resource $context [optional] ¬e.context-support;
* @return resource|false a file pointer resource on success, or false on error.
*/
function fopen ($filename, $mode, $use_include_path = false, $context = null) {}
/**
* Closes an open file pointer
* @link https://php.net/manual/en/function.fclose.php
* @param resource $stream <p>
* The file pointer must be valid, and must point to a file successfully
* opened by fopen or fsockopen.
* </p>
* @return bool true on success or false on failure.
*/
function fclose ($stream) {}
/**
* Gets line from file pointer and parse for CSV fields
* @link https://php.net/manual/en/function.fgetcsv.php
* @param resource $stream <p>
* A valid file pointer to a file successfully opened by
* fopen, popen, or
* fsockopen.
* </p>
* @param int $length [optional] <p>
* Must be greater than the longest line (in characters) to be found in
* the CSV file (allowing for trailing line-end characters). It became
* optional in PHP 5. Omitting this parameter (or setting it to 0 in PHP
* 5.0.4 and later) the maximum line length is not limited, which is
* slightly slower.
* </p>
* @param string $separator [optional] <p>
* Set the field delimiter (one character only).
* </p>
* @param string $enclosure [optional] <p>
* Set the field enclosure character (one character only).
* </p>
* @param string $escape [optional] <p>
* Set the escape character (one character only). Defaults as a backslash.
* </p>
* @return array|null|false an indexed array containing the fields read.
* </p>
* <p>
* A blank line in a CSV file will be returned as an array
* comprising a single null field, and will not be treated
* as an error.
* </p>
* ¬e.line-endings;
* <p>
* fgetcsv returns null if an invalid
* handle is supplied or false on other errors,
* including end of file.
*/
function fgetcsv ($stream, $length = 0, $separator = ',', $enclosure = '"', $escape = '\\') {}
mbstring拓展库:
/**
* Convert character encoding
* @link https://php.net/manual/en/function.mb-convert-encoding.php
* @param string|array $string <p>
* The string being encoded.
* </p>
* @param string $to_encoding <p>
* The type of encoding that str is being converted to.
* </p>
* @param string|string[] $from_encoding [optional] <p>
* Is specified by character code names before conversion. It is either
* an array, or a comma separated enumerated list.
* If from_encoding is not specified, the internal
* encoding will be used.
* </p>
* <p>
* "auto" may be used, which expands to
* "ASCII,JIS,UTF-8,EUC-JP,SJIS".
* </p>
* @return string The encoded string.
*/
#[Pure]
function mb_convert_encoding ($string, $to_encoding, $from_encoding = null) {}
参考资料
PHP 手册 函数参考 文件系统相关扩展 文件系统 文件系统函数 fgetcsv https://www.php.net/manual/zh/function.fgetcsv.php