首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 讀取文本文件內容並逐行輸出的完整實現指南

     編輯:PHP 相關知識

PHP 通過 `file()` 函數可一次性將文本文件讀入數組(每行一個元素),再配合循環遍歷輸出,是處理配置文件、日誌分析、數據導入的常用模式。本文詳細講解 `file()` 函數特性、逐行處理流程、內存考量及現代替代方案。

核心函數:file()

array file ( string $filename [, int $flags = 0 [, resource $context ]] )
  • 返回值:數組,每個元素對應文件一行,**包含換行符**(`\n`、`\r\n`)。
  • 常用標誌:
    • `FILE_IGNORE_NEW_LINES`:自動去除每行末尾換行符(推薦)。
    • `FILE_SKIP_EMPTY_LINES`:跳過空行。
    • `FILE_TEXT`:以文本模式讀取(默認)。
  • 失敗:返回 `false` 並觸發 `E_WARNING`。

基礎示例:讀取並顯示文件內容

<?php
$filename = 'data.txt';
// 文件內容:
// 第一行
// 第二行
// 第三行

// 1. 讀取文件到數組(自動去換行、跳空行)
$lines = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
if ($lines === false) {
    die("無法讀取文件: $filename");
}

// 2. 遍歷輸出
foreach ($lines as $lineNum => $line) {
    echo "第 " . ($lineNum + 1) . " 行: " . htmlspecialchars($line) . "
\n"; } /* 輸出: 第 1 行: 第一行 第 2 行: 第二行 第 3 行: 第三行 */ ?>

進階場景:解析 CSV/配置文件

<?php
// 解析簡單鍵值對配置:key=value
$config = [];
$lines = file('config.ini', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
    $line = trim($line);
    if ($line === '' || $line[0] === '#') continue; // 跳過註釋
    if (($pos = strpos($line, '=')) !== false) {
        $key = trim(substr($line, 0, $pos));
        $value = trim(substr($line, $pos + 1));
        $config[$key] = $value;
    }
}
print_r($config);
/* 輸出示例:
Array
(
    [db_host] => localhost
    [db_port] => 3306
    [debug] => true
)
*/
?>

內存效率對比:file() vs SplFileObject

特性file()SplFileObject
內存佔用O(文件大小) - 全量載入數組O(1) - 流式逐行迭代
適用文件大小< 100MB(視可用內存)無限制(GB 級)
隨機訪問支持($lines[100])不支持(僅順序)
性能單次讀取快逐行迭代略慢
功能豐富度基礎內置 CSV 解析、seek、current、key 等

大文件流式處理最佳實踐:SplFileObject

<?php
$file = new SplFileObject('huge.log', 'r');
$file->setFlags(
    SplFileObject::READ_CSV |       // 自動解析 CSV(可選)
    SplFileObject::DROP_NEW_LINE |  // 去除換行
    SplFileObject::SKIP_EMPTY       // 跳過空行
);
// 若非 CSV,僅用 DROP_NEW_LINE | SKIP_EMPTY

foreach ($file as $lineNum => $line) {
    // $line 可能是字符串(非 CSV 模式)或數組(CSV 模式)
    if (is_array($line)) {
        // CSV: [$col1, $col2, ...]
        processCsvRow($line);
    } else {
        // 純文本行
        processTextLine($line);
    }

    // 進度顯示
    if ($lineNum % 10000 === 0) {
        echo "已處理 $lineNum 行...\n";
    }
}
// 文件句柄自動關閉,內存常數級
?>

錯誤處理與健壯性

<?php
function readLinesSafe($filename, $flags = FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)
{
    if (!is_readable($filename)) {
        throw new RuntimeException("文件不可讀: $filename");
    }

    $lines = @file($filename, $flags); // 抑制 warning,自行拋異常
    if ($lines === false) {
        throw new RuntimeException("文件讀取失敗: $filename");
    }
    return $lines;
}

try {
    $data = readLinesSafe('data.txt');
    // 處理...
} catch (RuntimeException $e) {
    error_log($e->getMessage());
    // 用戶友好提示或重試邏輯
}
?>

編碼處理提醒

若文件為 GBK/GB2312 編碼,需轉碼後再處理:

$lines = file('gbk.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$lines = array_map(function($line) {
    return iconv('GBK', 'UTF-8//IGNORE', $line);
}, $lines);

總結

  • 中小文件、需隨機訪問、簡單邏輯:`file()` + `foreach` 最簡潔。
  • 大文件、流式處理、CSV 解析、內存敏感:`SplFileObject` 專業選擇。
  • 始終使用標誌位:`FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES` 減少後續 `trim()` 操作。
  • 異常處理:封裝安全讀取函數,統一錯誤處理流程。

掌握 `file()` 與 `SplFileObject` 兩大工具的適用邊界,能讓你從容應對從配置文件到 TB 級日誌的各類文本處理需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved