2012-08-11 175 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

相關問題