我对 php 和 MYSQL 非常陌生,所以这对很多人来说可能是一件非常简单的事情,但花了我几个小时。
我的开发人员创建了以下代码,用于将 csv 文件解析为一些 MYSQL 表。
一旦数据被解析到 MYSQL 表中,我就会有一个单独的脚本,用于在数据上创建一些搜索表单。例如,用户可以选择 X 列在 -50 到 +50 之间的所有数据。
我想完成两件事:
在 csv 文件中特定列的“NA”或空白的情况下,我希望它在数据库中不被识别为 0,这就是当前正在发生的情况。例如,如果我运行搜索,为 A 列选择 -10 到 10 之间的所有值,并且 A 列包含空格或“NA”,则这些空格或“NA”不应在搜索输出中被识别(并且数据库)为 0。但是,它们应该出现在每个搜索结果中。无论如何,在搜索表单中,我不想看到“NA”。我确信我不是第一个遇到这个问题的人,并且有一个最佳实践方法。
我想用空白替换 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>
最佳答案
使用
NULL
代替“NA”,然后是数字列。更新表 SET col1=NULL,其中 col1='NA'
导入后,
UPDATE table SET col1=NULL where col1=''
。否则,我真的不知道 '' 和空白有什么区别。
关于php - 通过模拟数据或使用空白替换 "NA"和空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26749206/