2012-03-24 42 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