使用(PHP)将每行中的第3和第4个分隔符从逗号更改为管道

时间:2013-03-08 16:38:47

标签: php

我有一个大约30或40行的文件。该文件看起来与此类似:

1234567899,05/30/13,1430,10,ANDERSON MONTE
4567891234,06/01/13,930,10,ANDERSON JENNIFER
7891234567,06/02/13,1515,10,ANDERSON MONTE

现在,我需要在管道的时间周围更改逗号。我还需要将它从24小时改为12小时,其后面是AM或PM。我正在从一个文件而不是从数据库中读取所有这些。所以我需要它最终看起来像这样:

1234567899,05/30/13|02:30PM|10,ANDERSON MONTE
4567891234,06/01/13|09:30AM|10,ANDERSON JENNIFER
7891234567,06/02/13|03:15PM|10,ANDERSON MONTE

任何帮助将不胜感激。我想尽可能使用PHP。它起初是一份报告,我已经能够解决上述问题了。

提前谢谢你 蒙

2 个答案:

答案 0 :(得分:0)

你可以尝试

$files = file("log.txt");
$list = array();

foreach ( $files as $data ) {
    $data = explode(",", $data);
    $time = sprintf("%s|%s|%s", 
            $data[1], 
            DateTime::createFromFormat("Gi", str_pad($data[2], 4, "0", STR_PAD_LEFT))->format("h:iA"), 
            $data[3]);
    $list[] = implode(",", array($data[0],$time,$data[4]));
}

echo "<pre>";
print_r($list);

输出

Array
(
    [0] => 1234567899,05/30/13|02:30PM|10,ANDERSON MONTE

    [1] => 4567891234,06/01/13|09:30AM|10,ANDERSON JENNIFER

    [2] => 7891234567,06/02/13|03:15PM|10,ANDERSON MONTE
)

答案 1 :(得分:0)

好吧,如果日期和时间总是排在第二和第三位,那么肯定会有一个解决方案是使用array_splicearray_slicejoin/implode

array_splice($arr, 1, 3, join('|', array_slice($arr, 1, 3));

这是完整的代码(但是帮助你可以解决问题,而不是解决问题)存在stackoverflow:

$in = fopen('input.txt', 'r');
$out = fopen('output.txt', 'w');
while(($line = fgetcsv($in)) !== FALSE) {
  # you're probably better off using methods of the DateTime class:
  $hours = substr($line[2], 0, -2);
  $line[2] = (($hours+12-1)%12+1) . substr($line[2], -2) . (($hours<12)?'AM':'PM');

  array_splice($line, 1, 3, join('|', array_slice($line, 1, 3));

  $fputcsv($out, $line);
}