首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在php中将数组写入csv文件?

如何在php中将数组写入csv文件?
EN

Stack Overflow用户
提问于 2021-07-08 04:41:18
回答 1查看 57关注 0票数 0

我有一个csv文件,内容如下:

代码语言:javascript
复制
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的特定值,则替换该数组的内容:

代码语言:javascript
复制
$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);的结果

代码语言:javascript
复制
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文件中,以获得如下所示:

代码语言:javascript
复制
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

我怎样才能做到这一点呢?

EN

回答 1

Stack Overflow用户

发布于 2021-07-08 06:55:03

您不能在像CSV这样的顺序文件中间轻松地编辑数据,因为您想要插入的数据几乎肯定与要删除的数据大小不同。

解决方案是读取输入文件,将新数据写入新的临时文件,然后删除旧文件并将临时文件重命名为原始名称。

例如:

代码语言:javascript
复制
<?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()逐行将其解压缩,然后应用更新并将结果写入新文件。

代码语言:javascript
复制
$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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68292756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档