2012-09-23 63 views
1

我需要的是寻找,然后替换sertain线的CSV文件一样的脚本。 该文件是这样的:文件manupulation搜索和替换CSV PHP

18:110327,98414,127500,114185,121701,89379,89385,89382,92223,89388,89366,89362,89372,89369 
21:82297,79292,89359,89382,83486,99100 
98:110327,98414,127500,114185,121701 

24:82297,79292,89359,89382,83486,99100

现在我需要更改线路21

这是笏我有这么远。

第2〜4位由folowed:AR一个CATERGORY数。此后的每个数字(后跟一个)都是一个页面的ID。 我从数据库访问te id的我想要的(即82297等)。

//test 2 
$sQry = "SELECT * FROM artikelen WHERE adviesprijs <>''"; 

$rQuery = mysql_query ($sQry); 

if ($rQuery === false) 
{ 
echo mysql_error(); 
exit ; 
} 

$aResult = array(); 

while ($r = mysql_fetch_assoc ($rQuery)) 
{ 

$aResult[] = $r['artikelid']; 


} 






$replace_val_dirty = join(",",$aResult); 

$replace_val= "21:".$replace_val_dirty; 




// file location 
$file='../../data/articles/index.lst'; 

// read the file index.lst 
$file1 = file_get_contents($file); 

//strip eerde artikel id van index.lst 
$file3='../../data/articles/index_grp21.lst'; 

$file3_contents = file_get_contents($file3); 


$file2 = str_replace($file3_contents, $replace_val, $file1); 






if (file_exists($file)) { 
echo "The file $filename exists"; 
} else { 
echo "The file $filename does not exist"; 

} 

if (file_exists($file3)) { 
echo "The file $filename exists"; 
} else { 
echo "The file $filename does not exist"; 

} 



// replace the data 
$file_val = $file2; 
// write the file 
file_put_contents($file, $file_val); 


//write index_grp98.lst 

file_put_contents($file3, $replace_val); 

mail('[email protected]', 'Aanbieding catergorie geupdate', 'Aanbieding catergorie geupdate'); 

任何人都可以指出我在正确的方向做到这一点吗? 任何帮助,将不胜感激。

回答

2

您需要打开原始文件和经过的每一行。当您找到要更改的行时,请更改该行。

正如当你做到这一点,你写一个临时文件,而这样做,你不能编辑文件,所以您复制行由行,以防行需要的改变,更改了该行。

当你与整个文件来完成,您复制临时文件到原始文件。

示例代码:

$path = 'file'; 

$category = 21; 
$articles = [111182297, 79292, 89359, 89382, 83486, 99100]; 

$prefix = $category . ':'; 
$prefixLen = strlen($prefix); 
$newLine = $prefix . implode(',', $articles); 

这部分是刚刚建立的基础:类别,物品的ID,然后建立与之相关的字符串。

现在打开文件更改行:

$file = new SplFileObject($path, 'r+'); 
$file->setFlags(SplFileObject::DROP_NEW_LINE | SplFileObject::SKIP_EMPTY); 
$file->flock(LOCK_EX); 

文件被锁定,同时得到改变没有其他进程可以编辑该文件。下一步,该文件,需要临时文件,太:

$temp = new SplTempFileObject(4096); 

建立两个文件后,让我们在每个行$file,并比较其是否需要更换:

foreach ($file as $line) { 
    $isCategoryLine = substr($line, 0, $prefixLen) === $prefix; 
    if ($isCategoryLine) { 
     $line = $newLine; 
    } 
    $temp->fwrite($line."\n"); 
} 

现在$temp文件包含已更改的行。注意,我用UNIX类型EOF(行尾)字符(\n)的,根据您的具体文件类型可能会有所不同。

所以,现在需要将临时文件复制到原始文件。让我们倒带文件,截断它然后重新写入所有行:

$file->seek(0); 
$file->ftruncate(0); 
foreach ($temp as $line) { 
    $file->fwrite($line); 
} 

最后,你需要抬起锁:

$file->flock(LOCK_UN); 

就是这样,在$file,该行已被替换。

实施例在一次:

$path = 'file'; 

$category = 21; 
$articles = [111182297, 79292, 89359, 89382, 83486, 99100]; 

$prefix = $category . ':'; 
$prefixLen = strlen($prefix); 
$newLine = $prefix . implode(',', $articles); 

$file = new SplFileObject($path, 'r+'); 
$file->setFlags(SplFileObject::DROP_NEW_LINE | SplFileObject::SKIP_EMPTY); 
$file->flock(LOCK_EX); 

$temp = new SplTempFileObject(4096); 

foreach ($file as $line) { 
    $isCategoryLine = substr($line, 0, $prefixLen) === $prefix; 
    if ($isCategoryLine) { 
     $line = $newLine; 
    } 
    $temp->fwrite($line."\n"); 
} 

$file->seek(0); 
$file->ftruncate(0); 
foreach ($temp as $line) { 
    $file->fwrite($line); 
} 

$file->flock(LOCK_UN); 

应与PHP 5.2工作和以上,我使用PHP 5.4数组的语法,可以用array(111182297, ...)万一您使用PHP 5.2/5.3替换[111182297, ...]

+0

谢谢!我今晚会尝试这个,让你知道。 – user1595774

+0

是$ articles的替换值吗?如果是,我可以用这个字符串$ replace_val吗? – user1595774

+0

'$ articles'是一个包含所有文章ID的数组。我在这里使用该数组来模拟数据库。例如。如果你可以从你的数据库返回一个ID数组,你可以设置'$ articles'。 – hakre