查找csv是否具有特定标头,如果是,则格式化该特定值

时间:2015-12-07 17:22:00

标签: php csv

我一直在努力解决这个PHP问题。我有一个带有客户信息的csv文件,看起来像这样。

clientName, clientNumber, clientStatus
Name1,123456,1
Name2,123457,0

现在,问题如下。有时csv也有出生日期......如下:

clientName, clientNumber, clientDOB, clientStatus
Name1,123456,01/10/1980,1
Name2,123457,1980-10-01,0

您可以看到日期格式不同。在将csv转换为数组时,我需要检查csv中是否有clientDOB,如果是,则将其格式化为mysql。

function dateToMysql($date) {
    $mysqlDate = date("Y-m-d",strtotime(str_replace('/','-',$date)));

    return $mysqlDate;
}

function csvToArray($filename='', $delimiter=',') {
    if(!file_exists($filename) || !is_readable($filename)) {
        return FALSE;
    }

    $header = NULL;
    $data = array();

    if (($handle = fopen($filename, 'r')) !== FALSE) {
        while (($row = fgetcsv($handle, 10000, $delimiter)) !== FALSE) {
            if(!$header) {
                $header = $row;
            } else {

                if (in_array("clientDOB", $header)) {
                    //echo dateToMysql($header['clientDOB'][$row])."<br>";
                    $data[] = dateToMysql(array_combine($header, $row));
                } else {
                    $data[] = array_combine($header, $row);
                }
            }
        }
        fclose($handle);
    }
    return $data;
}

echo "<pre>";
print_r(csvToArray($_FILES['csvFile']['name']));
echo "</pre>";

任何帮助将不胜感激。谢谢

1 个答案:

答案 0 :(得分:1)

这是一个更新的功能:

function csvToArray($filename='', $delimiter=',') {
    if(!file_exists($filename) || !is_readable($filename)) {
        return FALSE;
    }

    $header = NULL;
    $data = array();

    if (($handle = fopen($filename, 'r')) !== FALSE) {
        while (($row = fgetcsv($handle, 10000, $delimiter)) !== FALSE) {
            $row = array_map('trim', $row);

            if (!$header)
                $header = $row;
            else
            {
              $row = array_combine($header, $row);
              if ( isset( $row[ 'clientDOB' ] ) )
                  $row[ 'clientDOB' ] = date('Y-m-d', strtotime( $row[ 'clientDOB' ] ) );
              $data[] = $row;
            }
        }
        fclose($handle);
    }
    return $data;
}

值得注意的变化:

  • $row = array_map('trim', $row)确保名称和值周围没有周围空格,否则['clientDOB']将不匹配(因为它是[' clientDOB']

  • 在将$row['clientDOB']追加到$row之前更改$data的值。您的dateToMysql函数需要$date,而是传递了一个关联数组。

  • 使用strtotime无需替换:它可以处理两种日期格式。