【问题标题】:Trim data in csv file and remove extra blank header修剪 csv 文件中的数据并删除额外的空白标题
【发布时间】:2012-02-20 18:07:55
【问题描述】:

我现在正在使用此代码将 csv 数据导入我的数据库。(感谢 Francis Avila)

 if (($handle = fopen($source_file, "r")) !== FALSE) {
     $columns = fgetcsv($handle, $max_line_length, ",");
     $esc_columns = array();
     foreach ($columns as &$column) {
         $column1 = str_replace(".","",$column);
         $column = preg_replace("/\s*,\s*/",",",$column1);
         $esc_columns[] = escapeSqlName($column);
     }

     $esc_columns[] = escapeSqlName('custgroup');
     $esc_columns[] = escapeSqlName('user_id');
     $esc_columns[] = escapeSqlName('mylabel');

     $x = preg_replace("/\s*,\s*/", ",", implode(',',$esc_columns));
     $xx = str_replace(' ', '', $x);

     $sqlsmttempl = 'INSERT DELAYED INTO %s (%s) VALUES (%s)';
     $sqlsmt = sprintf($sqlsmttempl,
         escapeSqlName($target_table), 
         $xx, 
         implode(',',array_fill(0, count($esc_columns), '?')) 
);


     $db = new PDO("mysql:host=localhost;dbname=Data;","root",""); 

     $insert = $db->prepare($sqlsmt); 

     while (($data = fgetcsv($handle, $max_line_length, ",")) !== FALSE) {
    while(count($data) < count($columns)) {
        $data[] = NULL;
    }

    $data[] = $_POST['custgroup'];
    $data[] = $_POST['user_id'];
    $data[] = $_POST['mylabel'];

    $insert->execute($data); 
}

我之前在标题空白处遇到了一些问题,所以我添加了

     $x = preg_replace("/\s*,\s*/", ",", implode(',',$esc_columns));
     $xx = str_replace(' ', '', $x);

所以现在空格将被忽略。

但是数据中的空格呢?(就在逗号的前面和结尾)。我试过trim($data),但我知道这是错误的。

当标题包含其他额外的逗号时,我不知道如何处理上传,例如:

Name,Address,Phone,,,,,(错误) 而不仅仅是Name,Address,Phone(正确)

有什么建议吗?提前致谢。

【问题讨论】:

    标签: php csv upload


    【解决方案1】:

    问题可以通过使用 rtrim ( string $str [, string $charlist ] )来解决:

    $x = preg_replace("/\s*,\s*/", ",", implode(',',$esc_columns));
    $xx = str_replace(' ', '', $x);
    $xx = rtrim($xx,',');
    

    对于 php 中的文本修剪,您可以使用:ltrim(左修剪)、trim(两侧修剪)、rtrim(右修剪)。所有接受参数(字符串 $str [, string $charlist ] ) $str - 输入字符串 $charlist - 要修剪的字符串

    $xx = trim($xx); //exclude spaces both sides so for "  text  " => "text"
    $xx = ltrim($xx); //exclude spaces left side so for "  text  " => "text  "
    $xx = rtrim($xx); //exclude spaces right side so for "  text  " => "  text"
    
    $xx = rtrim($xx,','); //adding second parameter ',' will not trim spaces, will trim coma
    

    您可以根据需要添加许多命令:

    $x = preg_replace("/\s*,\s*/", ",", implode(',',$esc_columns));
    $xx = str_replace(' ', '', $x);
    
    $xx = trim($xx); //trim spaces from both sides
    $xx = trim($xx,','); //trim comas from both sides
    

    注意:

    $xx = trim($xx,','); //this is faster (only one function call)
    
    //equivalent with
    $xx = ltrim($xx,',');
    $xx = rtrim($xx,',');
    

    【讨论】:

    • 感谢这个很棒的答案。对不起..但我可以再问一个问题吗?我怎样才能修剪和 rtrim 我的 csv 数据?
    • 再次感谢。但是 $xx 是我的 header ,我需要修剪的部分是以下数据。
    猜你喜欢
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2011-10-07
    • 2022-10-14
    • 2014-06-08
    • 1970-01-01
    • 2016-06-06
    • 2021-09-22
    相关资源
    最近更新 更多