gpt4 book ai didi

php - 使用 php 从平面文件加载数据

转载 作者:行者123 更新时间:2023-12-03 09:16:46 26 4
gpt4 key购买 nike

我有一个用作数据库的文本文件,并具有以下数据格式:

*NEW RECORD
NM = Stackoverflow
DT = 9/15/2006
DS = Overflow
DS = Stack
DS = stackoverflow.com
DS = FAQ

*NEW RECORD
NM = Google
DT = 9/4/1998
DS = G+
DS = Google
DS = Search engine
DS = Search

你明白了..

问题是我不知道如何使用 PHP 从特定记录加载特定数据。特别是当数据不是数组格式时。我需要将数据转换为数组格式吗?或者它们是我可以从当前格式检索信息的一种方式?

例如,这个 mysql 查询的等效代码是什么:

SELECT DT FROM MY_TXT WHERE DS = "Google"

最佳答案

如果您坚持使用这种格式,则需要自定义反序列化机制。这是适用于您的示例数据的一个:

<?php

date_default_timezone_set("UTC");

class Record {
public $nm = null;
public $dt = null;
public $ds = [];

function isValid() {
return $this->nm !== null && $this->dt !== null && count($this->ds) > 0;
}

function isEmpty() {
return $this->nm == null && $this->dt == null && count($this->ds) == 0;
}
}

function deserialise($filename, $newLineSeparator = "\n") {
$incompleteRecords = 0;
$records = [];
$lines = explode($newLineSeparator, file_get_contents($filename));

if ($lines)
$lines[] = "*NEW RECORD";

$record = new Record();
foreach ($lines as $line) {
$line = trim($line);
if ($line == "*NEW RECORD") {
if ($record->isValid())
$records[] = $record;
else if (!$record->isEmpty())
$incompleteRecords++;

$record = new Record();
} else if (substr($line, 0, 5) == "NM = ") {
$record->nm = substr($line, 5);
} else if (substr($line, 0, 5) == "DT = ") {
$record->dt = strtotime(substr($line, 5));
} else if (substr($line, 0, 5) == "DS = ") {
$record->ds[] = substr($line, 5);
}
}

echo "Found $incompleteRecords incomplete records.\n";

return $records;
}

我用你的数据尝试了一下,得到了这个输出:

Found 0 incomplete records.
Array
(
[0] => Record Object
(
[nm] => Stackoverflow
[dt] => 1158278400
[ds] => Array
(
[0] => Overflow
[1] => Stack
[2] => stackoverflow.com
[3] => FAQ
)

)

[1] => Record Object
(
[nm] => Google
[dt] => 904867200
[ds] => Array
(
[0] => G+
[1] => Google
[2] => Search engine
[3] => Search
)

)

)

这是你想要的吗?

一些注意事项

  • 一次性加载内存中的所有内容;无批处理
  • 使用strtotime将日期解析为时间戳;您可能只想将它们作为字符串加载(更简单),或者使用 DateTime 类。如果您使用 strtotime,请先设置适当的时区,如示例 (date_default_timezone_set) 所示。
  • 如果没有设置NM,或者没有设置DT,或者不存在DS条目,则假设记录无效。您可以通过调整 Record 类上的 isValid 方法来修改此约束。
  • 不对损坏的格式、小写字母等进行错误处理。
  • 假定 \n 作为换行符分隔符。如果您有 \r\n\r,只需将它们作为第二个参数调用 deserialise 函数即可。

关于php - 使用 php 从平面文件加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36660406/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com