PHP从文本文件中提取数据并写入另一个文件

时间:2012-08-11 11:34:04

标签: 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); 

我有一个文件(all.txt),内容如下:

    11111111111, 22222222222, 33333333333, 44444444444

我希望这样显示:

    11111111111 
    22222222222
    33333333333
    44444444444

并添加一个空格,然后在每行的文本相同的每个数字之后添加一些文本:

    11111111111 text here
    22222222222 text here
    33333333333 text here
    44444444444 text here

我有一个html表单,它传递要附加到每一行的自定义文本。 我需要保持文件all.txt不变,然后使用不同的名称保存新格式化的文件。

我已经尝试将变量放入我目前拥有“\ r \ n”的内爆中,但这不起作用。

非常感谢任何帮助。

提前致谢!

2 个答案:

答案 0 :(得分: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+]+将匹配任何不是连续数字的字符串,并将其替换为“some text”和新行。

实现相同的更复杂的版本将是:

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')))
    )
));

这将(由内而外):

  • 加载all.txt的内容并将其解析为CSV字符串。每个数组元素对应一个数字。
  • 这些数字中的每一个都附有来自POST超全球(you dont want to use REQUEST)的消息内容。
  • 然后将生成的数组连接回一个字符串,其中连接字符是换行符。
  • 生成的字符串将写入新文件。

如果上面的内容太难理解,这里有一个使用临时变量且没有lambda的版本:

$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);

它做同样的事情。

答案 1 :(得分: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);

这是为了根据需要格式化新文件,但是,您没有传递要附加到新文件的新$ text ['message']。您可以修改mod_file()方法,也可以在运行时在foreach()循环中传递它。

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