使用PHP更改CSV文件中的条目

时间:2015-02-20 14:30:46

标签: php csv

我有一个包含三列的CSV文件:

玛丽,150203_15:29:12,150203_16:10:12
约翰,150203_15:29:17,待
彼得,150203_15:29:35,150203_15:49:35
奥尔加,150203_15:30:43,以待
...
..

玛丽,150204_15:42:14,以待
彼得,150204_20:42:14,以待

因为该文件中有很多条目,所以我想要做的就是 根据用户名查找最新条目并更改最后一个值(从挂起到日期())。
在上面的示例中,我想要更改第3列中从挂起到日期的最新Mary条目。然后用当前的CSV文件替换更新的CSV文件。

关于如何处理的任何想法?

谢谢

3 个答案:

答案 0 :(得分:0)

您可以将该文件作为一个巨大的字符串使用并进行字符串替换。

$data = file_get_contents('your_file.csv');
$data = str_replace('Joe,150203_16:21:43,pending','Joe,15203_16:21:43,15204_15:23:43',$data);
file_put_contents('your_file.csv', $data);

下面的评论引起了人们的关注,即找出姓名的最新日期。这也很简单。假设您已加载$ data,如上所述......

$matches = array(); // Just to point out that this is an array
preg_match_all("/Joe,(.*),/", $data, $matches);

现在,$ matches [1]包含Joe的所有日期。你只想要那些待定的吗?没问题......

preg_match_all("/Joe,(.*),pending/", $data, $matches);

现在,$ matches [1]仅包含待定日期。哪个是最近的?

rsort($mathes[1]);

现在,$ matches [1] [0]是最近的日期。所以,你可以这样做:

$data = str_replace('Joe,'.$matches[1][0].',pending','Joe,'.$matches[1][0].',15204_15:23:43',$data);

这是绝对最有效的方法吗?不,难道难受吗?不,您应该考虑使用正确的数据库,但可能使用csv文件。

答案 1 :(得分:0)

如果在您的情况下将数据移动到数据库不是解决方案,则可以执行以下操作:

  1. 通过fgetcsv()逐行将CSV文件读入PHP 阵列
  2. 根据您的条件对数组进行排序并获取最新条目
  3. 更新条目
  4. 通过fputcsv()
  5. 将条目写回文件

答案 2 :(得分:0)

我实际上找到了一个更简单的解决方案。是我能想到的最简单的一个。

$line = $_SESSION[username].",".$_SESSION[LOGIN_TIME].",".'pending'."\r\n"; 
$newline = $_SESSION[username].","$_SESSION[LOGIN_TIME].",".date("ymd_H:i:s"). "\r\n";
$data = file_get_contents('login.log');
$data = str_replace($line,$newline,$data);
file_put_contents('login.log', $data);

因此无需扫描最新条目。我只是存储以前的条目值,并用新的值替换它们。

谢谢kainaw和BigScar