【问题标题】:Read in text file line by line php - newline not being detected逐行读取文本文件php - 未检测到换行符
【发布时间】:2010-10-23 11:58:21
【问题描述】:

我有一个我编写的 php 函数,它将获取一个文本文件并将每一行列为表格中自己的行。

问题是经典的“在我的机器上运行良好”,但当然,当我要求其他人生成我正在寻找的 .txt 文件时,它会继续以 1 行的形式读取整个文件。当我在我的文本编辑器中打开它时,它看起来就像我期望的那样,每行都有一个新名称,但它是换行符或其他东西。

到目前为止,我得出的结论可能与他们在 Mac 系统上使用的任何文本编辑器有关。

这有意义吗?是否有任何简单的方法来检测文本编辑器识别为新行的这个字符并将其替换为 php 可以识别的标准字符?

更新:添加以下行解决了问题。

ini_set('auto_detect_line_endings',true);

功能:

function displayTXTList($fileName) {
    if(file_exists($fileName)) {
        $file = fopen($fileName,'r');
        while(!feof($file)) { 
            $name = fgets($file);
            echo('<tr><td align="center">'.$name.'</td></tr>');
        }
        fclose($file);
    } else {
        echo('<tr><td align="center">placeholder</td></tr>');
    }       
}

【问题讨论】:

  • Mac,请不要使用 MAC。

标签: php newline text-editor


【解决方案1】:

【讨论】:

  • 默认是关闭的,所以他可能不知道。
  • 如果您无权访问 php.ini 文件怎么办?我不确定我是否能够修改它(我会同时研究它)
  • 运行时只需要使用ini_set来设置这个选项
  • 谢谢大家,我对php比较陌生,不知道ini_set函数。
  • 我从来不知道有这样的设置,总是使用开箱即用的 fget 并为我工作。谢谢指出
【解决方案2】:

file() 有什么问题?

foreach (file($fileName) as $name) {
    echo('<tr><td align="center">'.$name.'</td></tr>');
}

【讨论】:

  • 不添加ini_set('auto_detect_line_endings',true);这似乎无助于解决问题。
  • 还应该注意file() 将整个文件读入一个数组,或者更具体地说,读入内存。这个解决方案虽然确实有效,但在处理大文件时是不明智的。
【解决方案3】:

来自fgets的手册页:

注意:如果 PHP 在读取 Macintosh 计算机上或由 Macintosh 计算机创建的文件时无法正确识别行结尾,则启用 auto_detect_line_endings 运行时配置选项可能有助于解决问题。

另外,您是否尝试过file 功能?它返回一个数组;数组中的每个元素对应文件中的一行。

编辑:如果您无法访问 php.ini,您使用的是什么网络服务器?在 Apache 中,您可以使用 a .htaccess file 更改 PHP 设置。还有ini_set 函数允许在运行时更改设置。

【讨论】:

    【解决方案4】:

    这是换行问题的经典案例。

    ASCII 定义了几个不同的“换行”字符。我们关心的两个具体是 ASCII 10(换行,LF)和 13(回车,CR)。

    所有基于 Unix 的系统,包括 OS X、Linux 等,都将使用 LF 作为换行符。 Mac OS Classic 使用 CR 只是为了与众不同,而 Windows 使用 CR LF(没错,两个字符作为换行符 - 看看为什么没有人喜欢 Windows?开玩笑吧)作为换行符。

    因此,来自 Mac 上某人的文本文件(假设它是现代操作系统)都将 LF 作为其行结尾。如果您尝试在 Windows 上阅读它们,而 Windows 需要 CR LF,它不会找到它。现在,it has already been mentioned PHP 有能力为你解决这个问题,但如果你愿意,这里有一个占用内存的解决方案:

    $file = file_get_contents("filename");
    $array = split("/\012\015?/", $file); # won't work for Mac Classic
    

    当然,你可以用file() (as has already been mentioned) 做同样的事情。

    【讨论】:

      猜你喜欢
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多