2012-03-24 3 views
1

私はこれがうまく動作しないように助けが必要です。配列から各2000行の印刷ファイルにPHPスクリプトを変更してください

easylist.txtを特定のJson形式に変換して、Untangle Firewallにインポートしようとしています。

私はそれを変換するために実行しているPHPスクリプトです。 問題は、インポート中に約2,000行の制限があることです。 それで、2000行ごとにエクスポートファイルを作成する必要があります。必要な数のファイルを作成します。

この問題の助けが必要です。

おかげで(すなわちエントリは複数行にまたがるず、各行は「アトミック」である)あなただけの任意の入力データを分割することができますと仮定すると

<?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

は、なぜあなたは代わりに '' foreach'のfor'ループを試していけませんか? – safarov

+0

私はあなたの問題を理解していません。あなたのサイクルのためのカウンタを配列に格納するのはなぜでしょうか?そして、2000を打つとファイルに書き込んで配列を空にしてください。これがあなたの望むものでない場合は、詳細を記入してください。 – slash197

+0

数年前、私はPHPやプログラミングでこの問題を扱っていたので、少し "錆びた"ものです。 どちらも可能なように聞こえます。 – WebFooL

答えて

0

をWebFooLその後、あなただけの行数を抽出することができますあなたが必要です

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

本当に "悪い文字"を削除する必要はありますか? json_encodeを使用して調査しましたか?

+0

これをテストし、あなたに連絡します。 ありがとう.. 悪い文字については、削除する必要がありますが、インポートスクリプトに行う必要があります。しかし、削除する必要のない余分なものを削除している可能性があります。 – WebFooL

+0

ああ、変化を見て、私はあなたが最初のポストであなたを導いていないと思う。 Exportfile1.jsonへの最初の2000行を取得する必要があります。 ExportFile2.jsonなどへのSecound 2000行など、最後のファイルは残っている数だけ印刷する必要があります。 – WebFooL

+0

@WebFooL私の編集した答えを見てください。それはあなたを始めるはずです。 – liquorvicar

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

ありがとう、私はそれらをすべて1つのファイルに書き込む必要がありますが、行を分割するか、またはzipファイルで何かをしなければならないかどうかを調べなければなりません。 – WebFooL

+0

はうまくスケールされません。メモリにファイルのフルコンテンツを2回保存し、オーバーヘッドを加算します。ファイルを行単位で処理する方が良いでしょう( 'fopen()' + 'fgets()') – Kaii

+0

Kaii - まったくスケーラビリティがありません。ファイアウォールルールをインポートするだけであり、多くの人が同時に非常に多く使用する可能性はないので、それは問題だとは思わないでしょう。ファイルが大きい場合やメモリが問題である場合、 'fopen()' + 'fgets()'がはるかに良い解決策になります。その後、私はその多くのルールでファイアウォールを詰まらせたくありません。 –

関連する問題