Importare grandi quantità di dati

alessapan

Member
You are using DaDaBIK version 10.2-Manarola enterprise, installed on 17/08/2020 .

System info
PHP Version: 7.2.26

mysql version: 5.7.29-32-log

Web server: Apache

Buongiorno
Una volta creata la struttura delle tabelle, è possibile importare grandi quantità di dati da altre fonti come ad esempio file excel o csv o ods?

La mia esatta esigenza è importare i dati da un'applicazione della mia struttura centrale che non permette connessioni esterne ma esclusivamente un'esportazione di dati in formato csv.
La tabella contente circa 2.000 record, corrispondenti a singoli iscritti, viene aggiornata centralmente ed è impoponibile aggiornare manualmente i record modificati. Devo pertanto procedere ad un caricamento periodico di tutti i dati che successivamente saranno relazionati ad altre tabelle proprie della mia struttura.

Grazie

Alessandro

Grazie
 

eugenio

Administrator
Staff member
Buongiorno,
non ci sono meccanismi di importazioni dei dati via CSV se non durante l'installazione di dadabik.

Deve importare i dati tramite phpmyadmin o altri tool oppure tramite un apposito script; se però è necessario effettuare importazioni incrementali e le modifiche possono essere eseguite sia in dadabik che in un altro tool la cosa è complessa da gestire.

In generale, se la stessa tabella può essere modificata sia in dadabik che in altri tool, si presenta anche un altro problema: il "locking" del record imposto da dadabik in fase di modifica non garantisce che altri utenti non possano modificare lo stesso record contemporaneamente.

Saluti,
 

alessapan

Member
Ciao Eugenio

dopo un pò di studio su PHP...ho trovato la soluzione ovviamente adattata alla mia esigenza.
Per poter caricare ed aggiornare una tabella contenente più di 2000 record ho separato la cosa in due passaggi. Questo mi consente di utilizzare la prima funzione di importazione dei dati anche per altre necessità simili.
Procedo quindi a caricare il file CSV su una cartella server del mio dominio tramite una custom page di upload della quale poi incollo il codice. Il file CSV è opportunamente formattato per renderlo compatibile con il mio db mysql.
In un'altra custom page, creo un custom button per l'analisi ed il caricamento dei dati nella tabella, già esistente, del mio database, tabella che viene svuotata prima del caricamento. Questa tabella è di servizio ed è gestita solo dall'utente admin per evitare come dicevi problemi di "locking".
Nel secondo file PHP viene letto il file, caricata ogni riga in un array e poi ripulita da eventuali caratteri inattesi e scompattata per creare l'istruzione di INSERT nella tabella.

Ciao a tutti.....

Alessandro.

pagina PHP per caricare i files:
<HTML>
<head>
<title> PHP upload page </title>
</head>
<body>
<?php

error_reporting(2047);
if (isset($_POST["invio"])) {
$percorso = ".....il tuo percorso completo qui/uploads/";
if (is_uploaded_file($_FILES['file1']['tmp_name'])) {
if (move_uploaded_file($_FILES['file1']['tmp_name'], $percorso.$_FILES['file1']['name'])) {
echo 'Nome file: <b>'.$_FILES['file1']['name'].'</b><br>';
echo 'Dimensione: <b>'.$_FILES['file1']['size'].'</b> byte<br>';
echo '======================<br>';
echo 'File caricato correttamente<br><br>';
echo 'carica un altro file';
} else {
echo "si è verificato un errore durante l'upload: ".$_FILES["file1"]["error"];
}
} else {
echo "si è verificato un errore durante l'upload: ".$_FILES["file1"]["error"];
}
} else {
// HTML ?>
<form enctype="multipart/form-data" method="post" action="" name="uploadform">
<p><b>UPLOAD FILES</b></p>
<p>seleziona i files creati dal gestionale di MS ACESS da caricare sul server:</p> //io utilizzo Access come interfaccia intermedia per gestire i dati offline prima di renderli disponibili sul web
<input type="file" name="file1" size="50">
<br>
<input type="submit" value="carica" name="invio">
<br>
</form>
<?php
}
?>
</body>
</html>

pagina PHP per importare il file nella tabella del mio database:
<HTML>
<head>
<title> PHP upload page </title>
</head>
<body>
<?php
global $conn;
error_reporting(2047);
if (isset($_POST["iscritti"])) {
$percorso = ".....il tuo percorso completo qui/uploads/";
$fieldseparator = ";";
$lineseparator = "\n";
$nomefile="esportaIscritti.csv";
$csvfile = $percorso.$nomefile;

//cancella i dati precedentemente contenuti nella tabella iscritti
$sql = "TRUNCATE iscritti";
$_cp_elimina_dati = $conn->exec($sql);

//verifica se il file esiste
if (!file_exists($csvfile)) {
echo "File non trovato.\n";
exit;
}
$file = fopen($csvfile,"r");
if (!$file) {
echo "Errore nell'apertura dei dati del file.\n";
exit;
}
$size = filesize($csvfile);

if (!$size) {
echo "Il file è vuoto.\n";
exit;
}
$csvcontent = fread($file,$size);
fclose($file);

$lines = 0;
$linearray = array();
$conta_record = 1;
$totale_record = count(file($csvfile));
echo 'righe da importare nel file '.$nomefile.': '.$totale_record.'<br>';
foreach(explode($lineseparator,$csvcontent) as $line) {

$lines++;
$line = trim($line," \t");
$line = str_replace("\r","",$line);

$line = str_replace('"','',$line);

//$line = str_replace("'","".$line);

$linearray = explode($fieldseparator,$line);
$linemysql = implode("','",$linearray);
$query = "insert into iscritti values('$linemysql');";
//echo $query."<br>";
if ($conta_record != $totale_record +1){
$_cp_aggiorna_dati = $conn->exec($query);
$conta_record=$conta_record+1;
}
}
$conta_record=$conta_record -1;
echo "<br>Sono stati correttamente caricati $conta_record records contenuti nel file csv.\n";
} else {
// HTML ?>
<form enctype="multipart/form-data" method="post" action="" name="uploaddata">
<p><b>CARICAMENTO TABELLE</b></p>
<p>seleziona il tipo di elaborazione da effettuare</p>
<input type="submit" value="iscritti" name="iscritti">
<br>
</form>
<?php
}
?>
</body>
</html>
 
Top