通过模拟数据或使用空格来替换“NA”和空白

时间:2014-11-05 03:28:26

标签: php mysql

我是php和MYSQL的新手,所以对很多人来说这可能是一件非常简单的事情,但这需要花费数小时的时间。

我的开发人员创建了以下代码,用于将csv文件解析为一些MYSQL表。

将数据解析到MYSQL表后,我有一个单独的脚本,用于在数据上创建一些搜索表单。例如,用户可以选择列X介于-50和+50之间的所有数据。

我想完成两件事:

  1. 在特定列的csv文件中存在“NA”或空白的情况下,我希望在数据库中不将其识别为0,这是当前正在发生的事情。例如,如果我运行搜索,我为列A选择所有值在-10到10之间,而列A包含空格或“NAs”,则不应在搜索输出中识别这些空格或“NA”(和数据库)为0。但是,它们应该出现在每个搜索结果中。无论如何,在搜索表单中,我不想看到“NAs”。我确信我不是遇到这个问题的第一个问题,并且有一个最佳实践方法。

  2. 我想用空格替换csv文件中的所有“实例”。我知道我可以使用“preg_replace”函数,但我不知道放置它的最佳位置。

  3. 谢谢!

    <?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>
    

1 个答案:

答案 0 :(得分:0)

  1. 使用NULL代替“NA”,然后使用数字列。 UPDATE table SET col1=NULL where col1='NA'

  2. 导入后,UPDATE table SET col1=NULL where col1=''。否则,我真的不知道''和空白之间的区别是什么。