Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Trabalhando com ponteiros de arquivo em um csv


  1. É fgets() o melhor a ser usado para isso? É uma boa maneira de fazê-lo. Outra opção é ler o arquivo inteiro em um array com file() , então faça um loop sobre o array com foreach() .

  2. Preciso incorporar um retorno de chamada? Não. Basta realizar a consulta após ler cada lote de linhas do arquivo.

  3. Por onde começar? Quando o contador atingir o tamanho do lote, realize a consulta. Em seguida, defina o contador de volta para 0 e defina a string de consulta de volta para o valor inicial. Por fim, no final do loop, você precisará realizar a consulta com os valores restantes (a menos que o tamanho do arquivo seja um múltiplo exato do tamanho do lote, caso em que não restará nada).


$batch_size = 100;
$counter = 0;

//instead of executing query one by one,
//let us prepare 1 SQL query that will insert all values from the batch

$sql_prefix ="INSERT INTO workorderstest(id,parentid,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10) VALUES ";
$values = "";

while (($line = fgets($handle)) !== false) {
    $values .= "($line),";
    $counter++;
    if ($counter == $batch_size) {
        $values = substr($values, 0, strlen($values) - 1);
        $conn->query($sql_prefix . $values) or die($conn->error);
        $counter = 0;
        $values ="";
    }
}
if ($counter > 0) { // Execute the last batch
    $values = substr($values, 0, strlen($values) - 1);
    $conn->query($sql_prefix . $values) or die($conn->error);
}