我有一个带有一系列日期的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]
。
这是错误的:
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];
}