2012-03-24 33 views
1

我需要一些幫助才能使其以我想要的方式工作。將PHP腳本更改爲打印每個2000行的陣列文件

我試圖將easylist.txt轉換爲特定的Json格式並導入到我的Untangle防火牆。

Bellow是我正在運行的PHP腳本將其轉換。 問題是導入期間存在大約2000行的限制。 所以我需要它爲每個2000行創建一個導出文件。並根據需要執行多個文件。

在這個問題上的任何幫助將被假設。

由於WebFooL

<?php 
$Content = "./easylist.txt"; 
$lines = file($Content); 
$vJsonFileName = "AD-Blocker". ".json"; 
$badcharacters = array("#",'"', "'", "[", "]", "\n", "\t"); 
header("Content-type: application/json"); 
header("Content-Disposition: attachment; filename=$vJsonFileName"); 
header('Cache-Control: public'); 
echo "["; 
foreach($lines as $str){ 
$cleanstr = str_replace($badcharacters, "", $str); 
echo '{"enabled":true,"string":"'.$cleanstr.'","javaClass":"com.untangle.uvm.node.GenericRule"},'; 
} 
echo "]"; 
?> 
+0

你爲什麼不試着去'for'循環,而不是'foreach'? – safarov 2012-03-24 08:46:41

+0

我不明白你的問題。爲什麼不在你的循環中放置一個計數器來存儲數組中的行,並且當你點擊2000時將它們寫入文件並清空數組。如果這不是你想要的,請提供更多細節。 – slash197 2012-03-24 08:49:20

+0

幾年前,我與PHP或編程有關的工作,所以我有點「生疏」。 這聽起來像可能的方式。 – WebFooL 2012-03-24 08:54:37

回答

0

假設你可以任意地分割輸入數據(即條目不跨越多行和每行是「原子」),則可以只提取的行數你需要

$Content = "./easylist.txt"; 
$lines = file($Content); 
$linesSplit = array_chunk($lines, 2000); 

順便說一句,你真的需要刪除「壞字符」?你有沒有使用json_encode進行調查?

+0

將測試這個並且回覆給你。 謝謝.. 至於他們需要刪除的壞字符做導入腳本。但它可能是我刪除了一些不需要刪除的額外內容。 – WebFooL 2012-03-24 08:57:14

+0

啊希望看到變化,我想我想念在第一篇文章中帶領你。 我需要得到第一個2000行到Exportfile1.json Secound 2000行到ExportFile2.json等,最後一個文件應該打印儘可能多的剩下的。 – WebFooL 2012-03-24 09:00:41

+0

@WebFooL看到我編輯的答案。這應該讓你開始。 – liquorvicar 2012-03-24 09:07:57

0

您無法下載多個文件,因此以下內容將創建多個文件。 有一個帖子在這裏關於壓縮和解文件:How to [recursively] Zip a directory in PHP?

<?php 
$Content = "./easylist.txt"; 
$lines = file($Content); 
$vJsonFileName = "AD-Blocker.zip"; 
$badcharacters = array("#",'"', "'", "[", "]", "\n", "\t"); 
$f = 1; 
foreach($lines as $str) 
{ 
    $c++; 
    if($c==2000) 
    { 
     $f++; 
    } 
    $cleanstr = str_replace($badcharacters, "", $str); 
    $json[$f] = '{"enabled":true,"string":"'.$cleanstr.'","javaClass":"com.untangle.uvm.node.GenericRule"},'; 
} 

foreach($json as $f => $arr) 
{ 
    file_put_contents('file'.$f,'['.implode('',$arr).']'); 
} 


//zip up all the files here to $vJsonFileName 


header("Content-type: application/json"); 
header("Content-Disposition: attachment; filename=$vJsonFileName"); 
header('Cache-Control: public'); 
?> 
+0

謝謝你將不得不看看,如果我應該把他們全部寫入一個文件,但只是單獨的行或必須做一些與zip文件的事情。 – WebFooL 2012-03-24 09:16:15

+0

doensn't擴展性不錯 - 您將文件全部內容存儲在內存中兩次,再加上開銷。最好是逐行處理文件('fopen()'+'fgets()') – Kaii 2012-03-24 11:42:38

+0

Kaii - 無可否認,它的可擴展性不是很好。我不會想象這是一個問題,但它只是用於導入防火牆規則,而不可能被很多人同時使用非常大。如果文件很大或者內存問題'fopen()'+'fgets()'會是一個更好的解決方案。然後我再也不想用這麼多規則堵塞我的防火牆。 – 2012-03-24 22:54:05