php - 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 将崩溃)。我希望空命令跳过空格,但事实并非如此。运行此脚本所需的示例数据在这里。
感谢您的任何帮助,
查尔斯
解决方案
经过一些急需的睡眠后,我发现了我的问题(有点)。我仍然认为 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);
}
?>
感谢您的关注。
推荐阅读
- c# - 如何为 OpenApi 标头设置字符串列表
- excel - 将列添加到源表后刷新电源查询?
- bash - `set -x` 会导致 bash 打印到哪里?
- json - 如何在Ms access VBA中的记录集中更新之前验证数据
- cookies - 刮亚马逊。搜索结果从一台机器到另一台机器完全不同
- c# - 我可以在不编码的情况下使用 Response.Redirect 吗?
- node.js - 如何在节点 js 中获取 Firebase 云存储数据的地图?
- php - Laravel Eloquent Pagination,如何在使用过滤器分页之前计数?
- ruby-on-rails - 运行“rails s”后如何修复“不安全的世界可写目录/mnt/c in PATH, mode 040777”错误
- here-api - 在 HERE Maps API 中检测鼠标点击位置上的所有对象