adinan-cenci/file-editor

一个用于读写文件的库。

v1.1.1 2023-07-22 14:29 UTC

This package is auto-updated.

Last update: 2024-09-22 17:07:01 UTC


README

一个用于编辑和读取文件的库。

这曾经是我 json-lines 库的一部分,但为了组织上的原因,我决定将其移动到一个独立的仓库。



如何使用它

实例化

use AdinanCenci\FileEditor\File;

$file = new File('my-file.txt');



迭代

foreach ($file->lines as $lineN => $line) {
    echo "$lineN: $line <br>";
}



向文件末尾添加一行

$file->addLine('foo-bar');



向文件中间添加一行

$lineN = 5;
$line  = 'foo-bar';
$file->addLine($line, $lineN);

如果文件行数少于 $line,则空行将填充空白。



向文件末尾添加多行

$lines = [
    'foo: bar',
    'bar: foo',
];

$file->addLines($lines);



向文件中间添加多行

$lines = [
    2 => 'foo: bar',
    6 => 'bar: foo',
];

$file->addLines($lines, false);



替换现有行

$lineN = 10;
$line  = 'foo-bar';
$file->setLine($lineN, $line);

::addLine()::setLine() 的区别在于 ::setLine() 将覆盖 $line 位置上已经存在的任何内容。



设置多行

$lines = [
    0 => 'foo: bar',
    5 => 'bar: foo',
];

$file->setLines($lines);



检索行

$lineN = 10;
$line  = $file->getLine($lineN);

如果行不存在,则返回 null



检索多对象

$linesN = [0, 1, 2];
$lines  = $file->getLines($linesN);



删除行

$lineN = 10;
$file->deleteLine($lineN);



删除多行

$linesN = [0, 1, 2];
$file->deleteLines($linesN);



搜索

该库还提供了一种查询文件的方法。
实例化一个新的 Search 对象,提供条件并调用 ::find() 方法,它将返回一个数组,包含匹配行,并按文件中的行号索引。

$search = $file->search();
$search->condition('content', 'value to compare', 'operator');
$results = $search->find();



等于操作符

$search->condition('lineNumber', 10, '=');
// Will match the 11th line in the file.



in 操作符

$search->condition('content', ['Iliad', ' Odyssey'], 'IN');
// Will match lines that match either "Iliad" or "Odyssey" 
// ( case insensitive ).



like 操作符

$search->condition('content', 'foo', 'LIKE');
// Will match lines that contains the word "foo"
// e.g: "foo", "foo bar", "foofighters" etc ( case insensitive ).

$search->condition('content', ['foo', 'bar'], 'LIKE');
// It also accept arrays. This will match match 
// "fool", "barrier", "barista" etc.



正则表达式操作符

$search->condition('content', '#\d{2}\/\d{2}\/\d{4}#', 'REGEX');
// Will match lines against a regex expression.



数字比较操作符

它还支持 "小于"、"大于"、"小于等于"、"大于等于" 和 "介于"。

$search
  ->condition('lineNumber', 2022, '<')
  ->condition('lineNumber', 1990, '>')
  ->condition('lineNumber', 60, '<=')
  ->condition('lineNumber', 18, '>=')
  ->condition('length', [10, 50], 'BETWEEN');



否定操作符

您也可以否定操作符。

$search
  ->condition('content', 'Iliad', '!=') // Different to ( case insensitive ).
  ->condition('content', ['Iliad', ' Odyssey'], 'NOT IN') // case insensitive.
  ->condition('length', [10, 50], 'NOT BETWEEN')
  ->condition('content', ['foo', 'bar'], 'UNLIKE');



多个条件

您可以将多个条件添加到搜索中。默认情况下,必须满足所有条件。

$search = $file->search();
$search
  ->condition('content', 'Iron Maiden', '=')
  ->condition('lineNumber', 2000, '<');
$results = $search->find();
// Will match entries for Iron Maiden, before the line 2000.

但您可以使其仅需要满足一个条件。

$search = $file->search('OR');
$search
  ->condition('content', 'Blind Guardian', '=')
  ->condition('content', 'Demons & Wizards', '=');
$results = $search->find();
// Will match entries for both Blind Guardian and Demons & Wizards.



条件组

您还可以分组条件以创建复杂的查询。

$search = $file->search('OR');

$search->andConditionGroup()
  ->condition('content', 'Angra', '=')
  ->condition('lineNumber', 2010, '<');

$search->andConditionGroup()
  ->condition('content', 'Almah', '=')
  ->condition('lineNumber', 2010, '>');

$results = $search->find();
// Will match entries for Angra from before line 2010 OR
// entries for Almah from after that



许可证

MIT



如何安装它

使用 composer。

composer require adinan-cenci/file-editor