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

使用PHP更改CSV文件中的条目,php,csv,Php,Csv,我有一个包含三列的CSV文件: 玛丽,150203_15:29:12150203_16:10:12 约翰,150203_15:29:17,待定 彼得,150203_15:29:35150203_15:49:35 奥尔加,150203_15:30:43,待定 … .. . 玛丽,150204_15:42:14,待定 彼得,150204_20:42:14,待定 因为那个文件上有很多条目,所以我只想 根据用户名查找最新条目并更改最后一个值(从挂起到日期() 在上面的例子中,假设我想将第3列中最新的Ma

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

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

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

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

有什么办法吗


谢谢

您可以将文件作为一个巨大的字符串处理,并进行字符串替换

$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文件。

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

  • 通过fgetcsv()逐行将CSV文件读入PHP,并将其读入 排列
  • 根据您的条件对数组进行排序并获取最新条目
  • 更新条目
  • 通过fputcsv()将条目写回文件

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

    $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

    我的2美分-使用DB更容易。你需要解析整个文件,然后对其进行排序,否则你无法真正找到给定用户的最新文件。你真的应该用DB来做这个。。。或者是一些可以保存XML、JSON或YAML等结构的东西。您仍然需要加载整个文件,但至少可以轻松获取用户名的所有条目。查找最新的条目就变成了对特定用户的数据子集使用过滤循环。@manny您要处理的记录是否总是以“挂起”结尾,并且用户名和“挂起”的组合是否总是唯一的?通常会有一个唯一的用户名设置为“挂起”。具有相同用户名的所有其他条目都将具有date()值。但您不知道“Joe”在文件中出现了多少次,也不知道第一个时间字符串是什么。正如弗雷德在上面所说的,这是探索DB.Correct的好时机。然而,有一些东西,比如preg_match,可以获取Joe的所有实例和所有日期。与其认为这是绝对没有希望的,不如想想。这些工具是可用的。这比使用数据库更难,但他已经选择使用csv而不是数据库。你能通过添加preg_match部分来改进你的答案吗?我并不是认为这是毫无希望的,我是说这将是一个很好的时间来复习一些数据库技能。我使用了最简单的正则表达式。如果一个人的名字中有逗号,它将失败。可以特别匹配(\d{6}\uud{2}:\d{2}:\d{2}),-但我不希望这会打断关于为什么不应该在非正则语言(即:自由文本)上使用正则表达式的讨论。如果没有文件锁定,您可能会遇到导致数据文件出错的竞争条件。