我有一个csv文件,内容如下:
123 , 2021-08-07 , Tr , Tam , Tr , Tam
123 , 2021-08-07 , Tr , Tem
1233 , 2021-08-07 , Ter , Tdm
12333 , 2021-08-07 , Tor , Tfem , Tr , Tam
12333 , 2021-08-07 , Pr , Tsem
123334 , 2021-08-07 , Tkr , Tm , Tr , Tam , Tsr , TK-S
1233344 , 2021-08-07 , Thr , TK , Tr , Tam
12333445 , 2021-08-07 , Tsr , TK-S这里我将内容读入数组,如果一个数组有一个长度为4的特定值,则替换该数组的内容:
$file = fopen('a.csv', 'r');
while (($line = fgetcsv($file)) !== FALSE) {
if($line[0] == "12333445")
{
$cnt= count($line);
if ($cnt==4)
{
$line=array("0"=>"purple","1"=>"orange");
}
}
print_r($line);
}
fclose($file);这是print_r($file);的结果
Array ( [0] => 123 [1] => 2021-08-07 [2] => Tr [3] => Tam [4] => Tr [5] => Tam )
Array ( [0] => 123 [1] => 2021-08-07 [2] => Tr [3] => Tem )
Array ( [0] => 1233 [1] => 2021-08-07 [2] => Ter [3] => Tdm )
Array ( [0] => 12333 [1] => 2021-08-07 [2] => Tor [3] => Tfem [4] => Tr [5] => Tam )
Array ( [0] => 12333 [1] => 2021-08-07 [2] => Pr [3] => Tsem )
Array ( [0] => 123334 [1] => 2021-08-07 [2] => Tkr [3] => Tm [4] => Tr [5] => Tam [6] => Tsr [7] => TK-S )
Array ( [0] => 1233344 [1] => 2021-08-07 [2] => Thr [3] => TK [4] => Tr [5] => Tam )
Array ( [0] => purple [1] => orange )现在,我想要将所有这些数组写入csv文件中,以获得如下所示:
123 , 2021-08-07 , Tr , Tam , Tr , Tam
123 , 2021-08-07 , Tr , Tem
1233 , 2021-08-07 , Ter , Tdm
12333 , 2021-08-07 , Tor , Tfem , Tr , Tam
12333 , 2021-08-07 , Pr , Tsem
123334 , 2021-08-07 , Tkr , Tm , Tr , Tam , Tsr , TK-S
1233344 , 2021-08-07 , Thr , TK , Tr , Tam
purple , orange我怎样才能做到这一点呢?
发布于 2021-07-08 06:55:03
您不能在像CSV这样的顺序文件中间轻松地编辑数据,因为您想要插入的数据几乎肯定与要删除的数据大小不同。
解决方案是读取输入文件,将新数据写入新的临时文件,然后删除旧文件并将临时文件重命名为原始名称。
例如:
<?php
$fileName = 'a.csv';
$tempName = 'temp.csv';
$inFile = fopen($fileName, 'r');
$outFile = fopen($tempName,'w');
while (($line = fgetcsv($inFile)) !== FALSE) {
if(($line[0] == "12333445") && (count($line) == 4))
{
$line=array("0"=>"purple","1"=>"orange");
}
print_r($line);
fputcsv($outFile, $line );
}
fclose($inFile);
fclose($outFile);
unlink($fileName);
rename($tempName, $fileName);请注意,这种逐行读写的风格可能会带来较差的性能。对于大文件,最好对输入和输出进行缓冲。
下面的示例使用file()将整个CSV文件读取到内存中,并使用str_getcsv()逐行将其解压缩,然后应用更新并将结果写入新文件。
$fileName = 'a.csv';
$tempName = 'temp.csv';
$inData = file($fileName, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$outFile = fopen($tempName,'w');
foreach($inData as $line) {
$data = str_getcsv($line);
if(($data[0] == "12333445") && (count($data) == 4)) {
$data=["purple","orange"];
}
print_r($data);
echo "\n";
fputcsv($outFile, $data );
}
fclose($outFile);
unlink($fileName);
rename($tempName, $fileName);https://stackoverflow.com/questions/68292756
复制相似问题