Importazione dati da CSV con Feeds, problema Timestamp

17 contenuti / 0 new
Ultimo contenuto
Importazione dati da CSV con Feeds, problema Timestamp

Ciao a tutti, mi sono messo ad usare Feeds per l'importazione di una serie di dati da un file CSV che venivano costantemente aggiornati. Mappando i campi creati con CCK, il sistema funziona, allora ho pensato di usarlo anche per l'importazione di alcuni contenuti da un database di Joomla. Lo so che ci sono altri moduli, di cui specifici per questo lavoro, ma anche con Feeds è un operazione comunque semplice. A parte il campo "created".
Mi servirebbe importare dai contenuti di Joomla, i campi : titolo, body, data creazione. Cosa ho fatto :

In phpmyadmin ho isolato nella tabella dei contenuti i campi che mi interessano, esportato in file CSV, mappati e importati con Feeds

Il fatto che, al contrario di Joomla, Drupal usa un campo timestamp per la data, e non riesco trovare il modo per convertirlo.

In questo screencast http://developmentseed.org/blog/2009/dec/15/importing-and-aggregating-st... , importa un CSV analogo al mio, non si vede però se nel CSV il campi della data sono in timestamp. Penso comunque di si, perchè se nel CVS la data è in formato data e la mappi in Feeds con "published date", non la converte.

Posso da phpmyadmin convertire il campo data in timestamp ?

Ciao

Con phpmyadmin non credo si possa fare.

La cosa più rapida è fare un piccolo script in PHP con una select e una update che trasformano la data in timestamp. Lo puoi fare su una copia del DB oppure direttamente sul CSV.

<--- Andrea Mancini - biso.it --->

Ciao, penso che si possa fare anche con un comando Sql da dare a phpmyadmin, ma non sono riuscito a trovarlo. Ho trovato però una funzione in php strtotime che dovrebbe convertire una stringa data in timestamt.

In php sono una ciofeca, chi mi può dare una mano a fare un semplice script che mi permetta di convertire sul database o sul file csv la colonna di data ?

Grassieeee

Trascrivi qui il formato della data che vuoi convertire?

Ciao, nella tabella del database la colonna "created" è di tipo datetime e la data è con questo formato "2009-08-08 06:29:50" .

Come vedi qui, il formato che hai tu a disposizione non è tra quelli supportati da strtotime, quindi hai davanti 2 soluzioni:
- o fai lievi modifiche a questo (sostituzione dello spazio con "T", aggiunta di ".00" in fondo dopo i secondi)
- o lo scomponi usando substr() e usi mktime() per creare il timestamp

Ciao Pinolo, guarda che io sono proprio una ciofeca in php, non ho idea di come si faccia a

Quote:
sostituzione dello spazio con "T", aggiunta di ".00" in fondo dopo i secondi

Ho fatto un po di esperimenti, e ti devo contraddire sul fatto che strtotime non supporti il formato di data che ho a disposizione.

Con questo codice

<?php
echo strtotime('2009-08-08 06:29:50');
?>

Io ottengo il timestamp 1249705790 , per verificare che sia correttto ho modificato un articolo che avevo importato col mio CSV in Drupal, aveva la data sballata perchè Feeds non converte in timestamp, ho inserito nella voce :"Informazioni sull'autore" la stessa data qui sopra, e andando a vedere il db di Drupal il timestamp è uguale al risultato della funzione strtotime.

Cacchio, ora dovrei aver bisogno di una dritta per un semplice script in php che :
- Si connetta al db
- legga il campo data della prima riga
- lo converta con la funzione strtotime
- lo inserisca nel campo "nuova data" che è una colonna vuota che ho creato nella tabella
- Un ciclo che lo faccia per tutte le righe della tabella.

Cosi facendo posso poi tramite phpmyadmin isolare le colonne che mi interessano, esportare il CSV, ed importare i miei contenuti in Drupal tramite Feeds.

HELP PLEASE !!!!!!!

Se hai creato una colonna a proposito, perchè non usare una query SQL per riempirlo? Se stai usando MySQL, prova con FROM_UNIXTIME (brain fart, sorry - hai bisogno della funzione inverso) UNIX_TIMESTAMP

Più imparo, più dubito.

Non riesco a capire come usare quella query , jhl.verona.

ps. sono una ciofeca anche di MySQL.

Io creo una colonna con valore timestamp, in phpmyadmin. Oppure la posso creare con valore text, penso funzioni lo stesso.

Se faccio questa query in phpmyadmin

SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00');

mi restituisce il timestamp,

ma posso fare query annidate ? tipo :

UPDATE nomeTabella SET nomeCampo = 'SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00');' WHERE id = '1';

Cmq dovrei fare un ciclo per tutte le row della tabella !!!! ;((

Scopiazzando qua e la ho messo assieme questo codice , che però naturalmente non funziona ..

<?php
$mysql
= new mysqli('localhost', 'root', 'root', 'test'); // Mi connetto al DB
$results = $mysql->query("SELECT * FROM `contents` WHERE 1"); // Creo una variabile con il n delle row
$i=1; // Contatore
while($results->fetch_assoc()) // Ciclo con funzione fetch_assoc per creare arrey associativo
{
   
$data=['created'];   //variabile con il valore nel campo created
   
$timestamp= strtotime($data);  // Converto la data in timestamp
   
$mysql->query("UPDATE 'contents' SET 'new_date' = '$timestamp' WHERE id = '$i'; "); // Query SQL con aggiunta del valore
   
++$i// Incremento contatore
}
$mysql->close(); // Chiudo connessione
?>

Le varie fasi le ho commentate per come le ho capite, probabilmente ho scritto pastrognate...

Che errore ho fatto ???

UPDATE nome_tabella SET colonna_timestamp = UNIX_TIMESTAMP(colonna_data);
Se no bisogna aggiungere il formatto data come secondo parametro della funzione UNIX_TIMESTAMP, ma credo che il default va bene.

Più imparo, più dubito.

EVVAIIIIIII !!!! FUNZIONAAAA !!!

Ho trovato il problema nel codice, senza sapere ne leggere e ne scrivere ......

Riporto il codice corretto per chi mai avrà una esigenza simile :

<?php
// Messo assieme da andreamac
$mysql = new mysqli('localhost', 'root', 'root', 'test'); // Mi connetto al DB
$results = $mysql->query("SELECT * FROM `contents` WHERE 1"); // Creo una variabile con il n delle row
$i=1; // Contatore
while($row=$results->fetch_assoc()) // Ciclo con funzione fetch_assoc per creare arrey associativo
{
   
$data=$row['created'];   //variabile con il valore nel campo created
   
$timestamp= strtotime($data);  // Converto la data in timestamp
   
echo ($timestamp . "<br />"); // Stampo a video per avere un riscontro
   
$mysql->query("UPDATE contents SET new_date = '$timestamp' WHERE id = '$i';"); // Query SQL con aggiunta del valore
   
++$i// Incremento contatore
}
$mysql->close(); // Chiudo connessione
?>

L'errore era nella creazione del ciclo !!

Col codice che ho riportato si può popolare un campo Text in una tabella, col valore di timestamp convertendo tramite funzione php ( strtotime ) un valore data.
Utile se c'è bisogno di importare dei contenuti in Drupal.

Ciao.

Sono contento che hai risolto il problema, ma non posso fare altro che correggere un errore - se non per evitare che altri fanno lo stesso sbaglio.

Il tuo codice presume che:

  1. La prima query restituisce i risultati in ordine crescente di identificatore (ma non è detto che fa così)
  2. Che il primo identificatore è 1 e che poi si incrementa da 1 (ma non è detto che fa così)

La soluzione è semplice - basta usare l'identificatore restituito nel $row:

<?php
// Messo assieme da andreamac
$mysql = new mysqli('localhost', 'root', 'root', 'test'); // Mi connetto al DB
$results = $mysql->query("SELECT * FROM `contents`"); // Creo una variabile con il n delle row
while ($row=$results->fetch_assoc()) { // Ciclo con funzione fetch_assoc per creare arrey associativo
   
$id = $row['id']; // l'identificatore della riga
   
$data=$row['created'];   //variabile con il valore nel campo created
   
$timestamp= strtotime($data);  // Converto la data in timestamp
   
echo ($id .'='. $timestamp . "<br />"); // Stampo a video per avere un riscontro
   
$mysql->query("UPDATE contents SET new_date = '$timestamp' WHERE id = '$id';"); // Query SQL con aggiunta del valore
}
$mysql->close(); // Chiudo connessione
?>

Più imparo, più dubito.

Bravissimo jhl.verona, ed è proprio il problema che mi è sorto, non capivo perchè alcuni dati non mi quadravano, non avevo il campo id dall'uno in poi !!!

Così è perfetto.

Ciao.

Perdonatemi, sono un neofita che sta cercando di imparare, non so se sono nella discussione giusta, ma io sto cercando di installare drupal e nella fase di creazione del database una volta creato con phpadmin, devo creare le tabelle e mi chiede di importare il file in formato sql o csv: dove lo trovo?
Grazie