需要帮助将日期数据从csv(m / d / Y)转换为Y / m / d(将其写入另一个csv)

问题描述 投票:0回答:1

我有一个带有一系列日期的csv。我已经将日期移到了一个数组($ data)中。具体来说,日期的数据为$ data [0]。我试图将它们从m / d / Y方式转换为UTF(Y / m / d),同时将数据写入另一个csv(这将是插入db的目标)。这是我到目前为止尝试过的:

$dt = date('Y/m/d', strtotime($data[0]));  //Didn't work
//Then i tried this:
$dt = DateTime::CreateFromFormat('m/d/Y', $data[0]);
$dt = $dt->format('Y/m/d');

第二个功能不起作用,因为出现错误:“在布尔值上调用成员函数format()”。我不确定为什么会收到该错误。一些帮助将不胜感激。

编辑:添加代码以显示对csv的编写。 这不是我使用的所有可能的行,但是作为一个简短的说明,我正在使用glob将文件放入数组(csvs)

foreach($files as $file)
{
    if(($handle = fopen($file, "r")) !== FALSE)
    {
        preg_match("/^.*([0-9]{4}-[0-9]{2}-[0-9]{2}).-.([0-9]{4}-[0-9]{2}-[0-9]{2}).*/", $file, $matches);

        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
        {
            if($data[0] != preg_match("/^.*([0-9]{2}-[0-9]{2}-[0-9]{4}).*/", $file))
            {
                $num = count($data);
                $row++;
                if(!file_exists($filename))
                {
                    $newFile = fopen($filename, "w");                                                                     fputcsv($newFile, $headers);
                }
                if(strlen($data[0] == 9) || strlen($data[0] == 10))
                {
                    $dt = DateTime::CreateFromFormat('m/d/Y', $data[0]);
                    $dt = $dt->format('Y/m/d');
                }
                fputcsv($newFile, [$defaults[0], $defaults[1], $defaults[2], $defaults[3], $defaults[4], $defaults[5], $defaults[6], $defaults[7],$defaults[8],$dt, $data[1], $data[4], $data[14], $data[7], $data[2], $data[3], $data[5], $data[6]]);      
            }
        }
    }
    fclose($handle);
    fclose($newFile);
}

基本上,这是名称中具有日期范围的匹配文件,将该日期范围存储在匹配项中,检查特定的行以查看是否有找到m / d / Y行的行,以开始将数据放置在新文件中CSV再次说明,它并非每行可能的代码行,但我认为这将使您对我正在做的事情有个好主意。在fputcsv中,您可以看到$ dt而不是data[0]

php csv
1个回答
0
投票

这是错误的:

                if(strlen($data[0] == 9) || strlen($data[0] == 10))

==不应位于对strlen()的调用内。应该是

                if(strlen($data[0]) == 9 || strlen($data[0]) == 10)

因此,您永远不会进入那个if块,因此它永远不会修复$dt

此外,如果此$dt测试失败,则需要分配if,因此您应该具有:

else {
    $dt = $data[0];
}
© www.soinside.com 2019 - 2024. All rights reserved.