Обрезать данные в CSV-файл и удалить лишний пустой заголовок - PullRequest
0 голосов
/ 20 февраля 2012

Я сейчас использую этот код для импорта данных CSV в мою базу данных. (Спасибо Фрэнсису Авиле)

 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 (правильно)

Любой совет? Заранее спасибо.

1 Ответ

3 голосов
/ 20 февраля 2012

Проблема может быть решена с помощью rtrim (строка $ str [, строка $ charlist]):

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

Для обрезки текста в php вы можете использовать: ltrim (обрезка слева), обрезка (обрезка с обеих сторон), rtrim (обрезка справа). Все принимаемые параметры (строка $ str [, строка $ 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,',');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...