2012-08-11 120 views
1

这是我在互联网上的第一篇文章,有关编码的一些帮助,请耐心等待! 我一直在互联网上找到开放代码几年,并将其修改为做我想做的事情,但我似乎已经碰到了这个我认为很简单的墙。如果你能帮助我,将非常感激。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”但这不起作用。

非常感谢任何帮助。

在此先感谢!

+0

你想达到什么目的?也许一个数据库更合适? – 2012-08-11 11:39:33

回答

2

关于您的代码的一些注意事项:您正将$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); 

它做同样的事情。

+0

戈登,非常感谢这 - 它的作品!但它确实在文件末尾留下了一个消息文本实例。有任何想法吗?也许有一个额外的空间在某处踢。关于我的代码,正如我所说的,我正在修改现有的代码,并在其中留下了一些显然不必要的代码。我非常感谢你的帮助! – Martyn 2012-08-11 12:30:34

+0

@ user1592162在all.txt中的最后一个数字后面可能有一个悬空的逗号。要么删除它,要么将'if'放入匿名函数中,检查'$ number'是否为空,或者在'strgetcsv'调用周围放置'array_filter'。 – Gordon 2012-08-11 12:31:41

+0

干杯。是否有可能通过名为'time'的html表单传递给脚本的第二个变量?我需要修改新文件存储位置的路径以包含时间,例如:folder/$ time/example.txt非常感谢。 – Martyn 2012-08-11 12:42:46

0

你的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()循环内传递它。

编辑*只是更新了整个代码,应该是现在你的目标。如果确实如此,请将答案标记为已接受。

+0

非常感谢Xhezairi! – Martyn 2012-08-11 12:32:45

+0

当你在'foreach'中覆盖''pos'到'modFile'时没有意义。另外新行是依赖于平台的。您将需要使用'PHP_EOL'来代替。 – Gordon 2012-08-11 12:37:38

相关问题