2017-08-03 81 views
-1

我创建了一个PHP脚本,允许我从csv文件上传大量数据文件。在导入时,我想将这样的特殊字符替换为字母c。下面是我的代码:PHP:从CSV导入数据到数据库时删除特殊字符

 $sql ="INSERT INTO bill_of_materials(allotment_code, category_name, activity, quantity, end_unit_quantity, unit, description, 
     unit_cost, regular_labor_cost, end_unit_labor_cost, type, batch) VALUES"; 

     while (($line = fgets($handle)) !== false) { 

      $sql .= "('".implode("', '", explode(";", sanitize($line)))."'),"; 
      $counter++; 
     } 

      $sql = substr($sql, 0, strlen($sql) - 1); 
      if (mysqli_query($new_conn, $sql) === TRUE) { 

       echo 1; 

       //database file name 
       $new_database_file = $new_database.'.sql'; 

       if(file_exists('backup/'.$new_database_file)) { 

        unlink('backup/'.$new_database_file); 

        // backup main database 

        $command = "C:/xampp/mysql/bin/mysqldump --host=$host --user=$user --password=$pass $database_name > backup/$new_database_file"; 
        system($command); 

       } else { 
        // backup main database 

        $command = "C:/xampp/mysql/bin/mysqldump --host=$host --user=$user --password=$pass $database_name > backup/$new_database_file"; 
        system($command); 
       } 
      } else { 
       echo $sql; 
      } 

此外,我从CSV数据即W2-A1 2/F前立面 - B和我想看到像W2的输出-A1 2/F正面 - B。我怎样才能做到这一点?

+0

我猜你正在寻找'str_replace()函数':例如 - 源文件),你可能惯于使用二进制翻译字符(首先你必须通过chr(ord($line[$position])))找出例如,通过为之倾倒损坏的二进制序列? [链接到文档](http://php.net/manual/en/function.str-replace.php)。希望这可以帮助! –

+0

你应该寻找'REGEX' – Twinfriends

+3

看起来是一个编码问题,确保你连接到mysql被设置为UTF-8 – exussum

回答

-1

首先,请确保您使用的是正确的database client charset collation。 如果数据库字符集/排序规则是正确的,你可以使用preg_replace消毒脏字符,像这样:

function sanitize($line){ 
    $clean = iconv('UTF-8', 'ASCII//TRANSLIT', $line); // attempt to translate similar characters 
    $clean = preg_replace('/[^\w]/', '', $clean); // drop anything but ASCII 
    return $clean; 
} 

如果这不会帮助(例如,你有真正的损坏二进制流 - 例如保存到CSV从旧的Excel

function sanitize($line){ 
    $map = [ 
     // corrupted chars sequence -> fixed chars 
     "\xC3\xA8" => 'č', 
     "\xC3\x88" => 'Č', 
     "\xC3\xB9" => 'ů', 
     "\xC3\x99" => 'Ů', 
     "\xC3\xAC" => 'ě', 
     "\xC3\x8C" => 'Ě', 
     "\xC3\xB8" => 'ř', 
     "\xC3\x98" => 'Ř', 
     "\x53\xC2\x8D" => 'Š', 
     "\xC2\xA9" => 'Š', 
    ]; 
    return str_replace(array_keys($map), $map, $line); 
} 
+0

这对我有用。谢谢。 –

+1

这不是一个好的解决方案。核心问题,而不是修补它。如果你设置enti将代码重新传递到正确的字符集,这将解决您的问题 - 正确。在这种情况下,“损坏”这个词也是不正确的,它只是一种不同的编码。 – Qirel

+0

@Qirel请注意,第一句建议修复数据库客户端整理/字符集。建议的PHP函数是用户无法解决的后备解决方案。 – lubosdz

相关问题