我是php和MYSQL的新手,所以对很多人来说这可能是一件非常简单的事情,但这需要花费数小时的时间。
我的开发人员创建了以下代码,用于将csv文件解析为一些MYSQL表。
将数据解析到MYSQL表后,我有一个单独的脚本,用于在数据上创建一些搜索表单。例如,用户可以选择列X介于-50和+50之间的所有数据。
我想完成两件事:
在特定列的csv文件中存在“NA”或空白的情况下,我希望在数据库中不将其识别为0,这是当前正在发生的事情。例如,如果我运行搜索,我为列A选择所有值在-10到10之间,而列A包含空格或“NAs”,则不应在搜索输出中识别这些空格或“NA”(和数据库)为0。但是,它们应该出现在每个搜索结果中。无论如何,在搜索表单中,我不想看到“NAs”。我确信我不是遇到这个问题的第一个问题,并且有一个最佳实践方法。
我想用空格替换csv文件中的所有“实例”。我知道我可以使用“preg_replace”函数,但我不知道放置它的最佳位置。
谢谢!
<?php
ini_set('max_execution_time', 0);
ini_set('display_errors', 'On');
ini_set('error_reporting', E_ALL & ~E_NOTICE);
$global_start = microtime(true);
include_once('db.php');
$full_path = @dirname(__FILE__) . '/';
$distinct_fields = array('g', 'i', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 'y', 'z', 'aa', 'ab', 'ac', 't', 'u', 'v');
if (isset($_POST['truncate'])) {
mysqli_query($mysqli, 'TRUNCATE TABLE odesk_nj_data');
mysqli_query($mysqli, 'TRUNCATE TABLE odesk_nj_catalog');
}
if (isset($_POST['filename']) && is_file($full_path . $_POST['filename'])) {
$separator = $_POST['separator'];
$handle = fopen($full_path . $_POST['filename'], "r");
$fields = array();
$i = 0;
$proccess_iteration = 0;
mysqli_autocommit($mysqli, false);
while (($data = fgetcsv($handle, 0, $separator)) !== FALSE) {
if ($i == 0) {
$fields = $data;
} elseif ($data[0] != '') {
$branch_id = GetBranchId($data[0]);
$qs = 'INSERT INTO odesk_nj_data SET branch_id=' . $branch_id;
foreach ($fields as $index => $field_name)
{
if (strtolower($field_name) != 'a' /*&& strtolower($field_name)!='ad'*/)
{
$tmp = explode(',', $data[$index]);
// if ($data[$index] == '' || $data[$index] == 'NA')
// {
// $value = -1000.99;
// }
// elseif (count($tmp) == 2 && is_numeric($tmp[0]) && is_numeric($tmp[1]))
if (count($tmp) == 2 && is_numeric($tmp[0]) && is_numeric($tmp[1]))
{
$value = implode('.', $tmp);
} else {
$value = $data[$index];
}
$qs .= ', `' . strtolower($field_name) . '`="' . $value . '"';
}
if (in_array(strtolower($field_name), $distinct_fields)) {
SaveToCatalog(strtolower($field_name), $value);
}
}
mysqli_query($mysqli, $qs);
}
$i++;
$proccess_iteration++;
if ($proccess_iteration > 300) {
mysqli_commit($mysqli);
$proccess_iteration = 0;
mysqli_autocommit($mysqli, false);
}
}
mysqli_commit($mysqli);
echo 'Upload Complete! Was uploaded ' . ($i - 1) . ' rows.';
exit;
}
function SaveToCatalog($FieldName, $Value)
{
global $mysqli;
static $data;
if (!isset($data[$FieldName])) {
$result = mysqli_query($mysqli, 'SELECT * FROM odesk_nj_catalog WHERE field="' . $FieldName . '" ');
while ($item = mysqli_fetch_assoc($result)) {
$data[$FieldName][base64_encode($item['field_value'])] = true;
}
}
if (!isset($data[$FieldName][base64_encode($Value)])) {
$result = mysqli_query($mysqli, 'SELECT * FROM odesk_nj_catalog WHERE field="' . $FieldName . '" AND field_value="' . mysqli_real_escape_string($mysqli, $Value) . '"');
$info = mysqli_fetch_assoc($result);
if (isset($info['id']) && $info['id'] > 0) {
$data[$FieldName][base64_encode($Value)] = true;
} else {
mysqli_commit($mysqli);
mysqli_autocommit($mysqli, true);
$qs = 'INSERT INTO odesk_nj_catalog SET field="' . $FieldName . '", field_value="' . $Value . '"';
mysqli_query($mysqli, $qs);
if (mysqli_insert_id($mysqli) > 0) {
$data[$FieldName][base64_encode($Value)] = true;
}
mysqli_autocommit($mysqli, false);
}
}
}
function GetBranchId($BranchName)
{
global $mysqli;
static $branches;
if (empty($companies)) {
$result = mysqli_query($mysqli, 'SELECT * FROM odesk_nj_branches ');
while ($item = mysqli_fetch_assoc($result)) {
$branches[$item['branch_name']] = $item['branch_id'];
}
}
if (!isset($branches[$BranchName])) {
$result = mysqli_query($mysqli, 'SELECT * FROM odesk_nj_branches WHERE branch_name="' . $BranchName . '"');
$company_info = mysqli_fetch_assoc($result);
if (isset($company_info['branch_id']) && $company_info['branch_id'] > 0) {
$branches[$BranchName] = $company_info['branch_id'];
} else {
mysqli_commit($mysqli);
mysqli_autocommit($mysqli, true);
$qs = 'INSERT INTO odesk_nj_branches SET branch_name="' . $BranchName . '"';
mysqli_query($mysqli, $qs);
$branches[$BranchName] = mysqli_insert_id($mysqli);
mysqli_autocommit($mysqli, false);
}
}
return $branches[$BranchName];
}
?>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<form enctype="multipart/form-data" method="post" action="nj_load.php">
Filename to parse: <input type="text" name="filename" value="Table.csv"><br/>
CSV Separator: <input type="text" name="separator" value=","><br/>
Truncate Table before parsing: <input type="checkbox" name="truncate" checked=""><br/>
<input type="submit" value="Parse">
</form>
</body>
</html>
答案 0 :(得分:0)
使用NULL
代替“NA”,然后使用数字列。 UPDATE table SET col1=NULL where col1='NA'
导入后,UPDATE table SET col1=NULL where col1=''
。否则,我真的不知道''和空白之间的区别是什么。