PHP从文本文件中提取数据并写入另一个文件
这是我在互联网上的第一篇文章,有关编码的一些帮助,请耐心等待! 我一直在互联网上找到开放代码几年,并将其修改为做我想做的事情,但我似乎已经碰到了这个我认为很简单的墙。如果你能帮助我,将非常感激。PHP从文本文件中提取数据并写入另一个文件
我有以下页面:
<?php
$text = $_REQUEST['message'];
$f = file_get_contents("all.txt");
$f = explode(", ", $f);
function modFile($pos, $tothis, $inthis)
{
foreach($inthis as $pos => $a){
}
$newarr = implode("\r\n", $inthis);
$fh = fopen("example.txt", "w");
fwrite($fh, $newarr);
fclose($fh);
}
modFile(4, '', $f);
我有一个文件(全部.txt)具有以下内容:
11111111111, 22222222222, 33333333333, 44444444444
那我希望像这样显示:
11111111111
22222222222
33333333333
44444444444
并添加一个空格,然后每个数字所在的文本在每行上都相同,然后添加一些文本:
11111111111 text here
22222222222 text here
33333333333 text here
44444444444 text here
我有一个html表单,可以将自定义文本传递到每行后面。 我需要保持文件all.txt完好,然后用不同的名称保存新格式的文件。
我已经尝试把变量放入implode,我现在有“\ r \ n”但这不起作用。
非常感谢任何帮助。
在此先感谢!
关于您的代码的一些注意事项:您正将$pos
传递给该函数,但它将在foreach
中被覆盖。 foreach
也是空的,所以它有什么好处?而且我也没有看到你在任何地方都使用$text
。
为了达到所需输出,试试这个来代替:
file_put_contents(
'/path/to/new.txt',
preg_replace(
'/[^\d+]+/',
' some text' . PHP_EOL,
file_get_contents('all.txt')
)
);
模式[^\d+]+
将匹配任何字符串,它是不连续的编号,并与“一些文本”和一个新行更换。
一个较为复杂的版本实现相同的是:
file_put_contents(
'/path/to/new.txt',
implode(PHP_EOL, array_map(
function ($number) {
$message = filter_var(
$_POST['message'], FILTER_SANITIZE_SPECIAL_CHARS
);
return sprintf('%s %s', trim($number), $message);
},
array_filter(str_getcsv(file_get_contents('/path/to/all.txt')))
)
));
这将(从内到外):
- 加载所有的内容。txt并将其解析为CSV字符串到数组中。每个数组元素对应一个数字。
- 这些数字中的每一个都附加了POST超全局消息(you dont want to use REQUEST)中的消息内容。
- 生成的数组然后连接回单个字符串,其中连接字符为换行符。
- 生成的字符串被写入新文件。
如果上面的太硬可循,这里是临时使用VAR和没有拉姆达版本:
$allTxtContent = file_get_contents('/path/to/all.txt');
$numbers = array_filter(str_getcsv($allTxtContent));
$message = filter_var($_POST['message'], FILTER_SANITIZE_SPECIAL_CHARS);
$numbersWithMessage = array();
foreach ($numbers as $number) {
$numbersWithMessage[] = sprintf('%s %s', trim($number), $message);
};
$newString = implode(PHP_EOL, $numbersWithMessage);
file_put_contents('/path/to/new.txt', $newString);
它做同样的事情。
戈登,非常感谢这 - 它的作品!但它确实在文件末尾留下了一个消息文本实例。有任何想法吗?也许有一个额外的空间在某处踢。关于我的代码,正如我所说的,我正在修改现有的代码,并在其中留下了一些显然不必要的代码。我非常感谢你的帮助! – Martyn 2012-08-11 12:30:34
@ user1592162在all.txt中的最后一个数字后面可能有一个悬空的逗号。要么删除它,要么将'if'放入匿名函数中,检查'$ number'是否为空,或者在'strgetcsv'调用周围放置'array_filter'。 – Gordon 2012-08-11 12:31:41
干杯。是否有可能通过名为'time'的html表单传递给脚本的第二个变量?我需要修改新文件存储位置的路径以包含时间,例如:folder/$ time/example.txt非常感谢。 – Martyn 2012-08-11 12:42:46
你的foreach()右大括号在错误的地方。您错过了运行新文件创建执行的确切部分。在这里:
$text = $_REQUEST['message'];
$f = file_get_contents("all.txt");
$f = explode(", ", $f);
function modFile($pos, $tothis, $inthis, $text){
$fh = fopen("example.txt", "w");
foreach($inthis as $pos => $a){
$newarr = $a." ".$text."\r\n";
fwrite($fh, $newarr);
}
fclose($fh);
}
modFile(4, "", $f, $text);
这是格式化你的新文件,你的愿望,但是,你没有通过新的$文本[“消息”]要追加到新的文件。你可以修改你的mod_file()方法,也可以在foreach()循环内传递它。
编辑*只是更新了整个代码,应该是现在你的目标。如果确实如此,请将答案标记为已接受。
你想达到什么目的?也许一个数据库更合适? – 2012-08-11 11:39:33