首页 > 解决方案 > PHP - 从文本文件中跳过 0D0A 行的问题

问题描述

我得到一个包含 MySQL 插入的文本文件 (.sql)。我发现有时会包含空行。这些空行包含十六进制值 0D0A(Windows 换行符)。当为查询发送空行时,MySQL 会报告错误。因此,当我读取/发送这些行到 MySQL 时,我想跳过发送任何空行。我想出了以下代码,但它没有按预期工作。换行符被删除,但空行仍被发送到 MySQL。我将问题追溯到 PHP 命令empty()。根据文档,“”应该被认为是空的。那么为什么它不跳过空行呢?我已经花了几天的时间来解决这个问题,但我没有尝试任何工作。我需要另一双眼睛,拜托。这是代码:

<?php
$bom = pack("H*", "EFBBBF");
if(($reading = fopen("sample.sql", "r")) !== false)
{
 $sql = preg_replace("/^$bom/", "", fgets($reading));
 while(!feof($reading))
 {
  $sql = str_replace(array("\n", "\r", "\r\n"), " ", $sql);
  if(!empty($sql))
  {
   echo("{$sql}<br>");
   $sql = fgets($reading);
  }
 }
 if(!feof($reading))
 {
  echo("Unexpected read error in file." . PHP_EOL);
 }
 fclose($reading);
}
?>

我用空格替换换行符(如果我尝试使用“”删除换行符 IIS 将崩溃)。我希望空命令跳过空格,但事实并非如此。运行此脚本所需的示例数据在这里

感谢您的任何帮助,

查尔斯

标签: php

解决方案


经过一些急需的睡眠后,我发现了我的问题(有点)。我仍然认为 empty() 应该看到 " " 为空,我会再次检查文档。

要修复我的代码,我必须更改 str_replace 以完全删除换行符。然后我不得不将 fgets 从 if 语句中移出(如果该行是空白的,您仍然需要获取下一行)。

万一其他人遇到这个问题,这里是更正的代码:

<?php
$bom = pack("H*", "EFBBBF");
if(($reading = fopen("sample.sql", "r")) !== false)
{
 $sql = preg_replace("/^$bom/", "", fgets($reading));
 while(!feof($reading))
 {
  $sql = str_replace(array("\r\n", "\n", "\r"), "", $sql);
  if(!empty($sql))
  {
   echo("{$sql}<br>");
  }
  $sql = fgets($reading);
 }
 if(!feof($reading))
 {
  echo("Unexpected read error in file." . PHP_EOL);
 }
 fclose($reading);
}
?>

感谢您的关注。


推荐阅读