如何通过解析大文件来创建一个数组?

13 浏览
0 Comments

如何通过解析大文件来创建一个数组?

我想逐行读取文件,但不要完全加载到内存中。\n我的文件太大,无法在内存中打开,如果尝试这样做,我总是会出现内存错误。\n该文件大小为1 GB。

0
0 Comments

如何通过解析大文件来创建一个数组?

问题的出现原因:

解决方法:

代码示例:

$file = new SplFileObject("file.txt");
// 循环直到文件末尾
while (!$file->eof()) {
    // 输出文件中的一行
    echo $file->fgets();
}
// 关闭文件句柄
$file = null;

这是一个更简洁的解决方案。谢谢;) 我之前没有使用过这个类,这里还有更多有趣的函数可以探索:[php.net/manual/en/class.splfileobject.php](http://php.net/manual/en/class.splfileobject.php)

谢谢。例如,在while循环之前添加以下代码可以去掉每行末尾的换行符:`$file->setFlags(SplFileObject::DROP_NEW_LINE);`

谢谢!如果你不想要每行字符串末尾的换行符,可以使用`rtrim($file->fgets())`来去除末尾的换行符。

是的,有的:[php.net/manual/en/splfileobject.eof.php](https://www.php.net/manual/en/splfileobject.eof.php)

甚至更简短的写法:`foreach (new SplFileObject('file.txt') as $line) echo $line`

0
0 Comments

如何通过解析大文件来创建一个数组?

这个问题的出现是因为在处理大文件时,我们需要一种有效的方法来解析文件并将其存储为数组。上述代码展示了一种使用while循环来逐行读取文件内容的方法。然而,有人指出使用while(!feof($file))的方式并不推荐,因为它可能导致一些问题。他们提供了一个指向stackoverflow上的链接,以进一步了解这个问题。

另外,还某些情况下在php.net官方文档中指出,当文件指针没有更多数据可读时,feof()函数会返回FALSE。然而,有人质疑feof()函数是否已经不存在了,对此我们需要进一步了解。

为了解决这个问题,我们可以考虑使用更现代的方法来解析大文件并创建数组。下面是一种可能的解决方案:

if ($file = fopen("file.txt", "r")) {
    $array = file("file.txt", FILE_IGNORE_NEW_LINES);
    fclose($file);
}

上述代码使用了file()函数,它可以直接将文件内容读取到一个数组中。这个函数还有一个可选参数FILE_IGNORE_NEW_LINES,它可以忽略掉每行末尾的换行符。通过这种方式,我们可以更简洁地实现将文件内容解析为数组的功能。

总结起来,通过使用file()函数,我们可以更简洁地解析大文件并将其存储为数组,而不需要使用while循环和feof()函数。这种方法更加现代和高效。

0
0 Comments

如何通过解析大文件来创建一个数组?

在处理大文件时,我们不能将整个文件读入内存,因为这样会占用过多的内存空间。因此,我们需要一种方法来逐行读取文件并将其解析为数组。

我们可以使用fgets()函数逐行读取文件:

$handle = fopen("inputfile.txt", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        // process the line read.
    }
    fclose($handle);
}

这段代码会打开一个文件句柄,并使用fgets()函数逐行读取文件。在每次循环中,我们可以对读取到的行进行处理。

这种方法不会将整个文件读入内存中,所需的最大内存取决于输入中最长的行。

如果要在上传文件的同时读取文件,可以尝试这个答案

在某些情况下,读取文件的每一行并没有一个明确定义的结果。在这种情况下,我们可以定义一个规则来决定应该如何处理。例如,可以输出消息"Line too long; giving up."表示行太长,放弃处理。

另外需要注意的是,fgets()有时会返回布尔值false,即使文件尚未结束。因此,在循环条件中检查fgets() !== false,并在循环结束后确保feof() === true可能更安全一些。

通过以上方法,我们可以逐行读取大文件并将其解析为数组。这种方法避免了将整个文件读入内存的问题,适用于处理大型文件。

0